0

방금 ​​Google Cloud Endpoints로 시작했습니다. 저는 Python으로 API를 제작했으며 Android Studio/Gradle 환경에서 생성 된 소스를 사용해야했습니다.Google Cloud Endpoints : 응답에 DateTime 필드가 포함 된 경우 Android 클라이언트의 NumberFormatException

Cloud Endpoints의 응답에 DateTime 개체가 포함될 때마다 NumberFormatException이 throw되는 문제가 있습니다.

08-05 13:27:28.143 32116-32141/com.dgt.ds E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
     java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 
     Caused by: java.lang.IllegalArgumentException: [key created_at, field private com.google.api.client.util.DateTime com.google.api.services.dsApi.model.ServicesDResponse.createdAt] 
     at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:797) 
     at com.google.api.client.json.JsonParser.parse(JsonParser.java:438) 
     at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:745) 
     at com.google.api.client.json.JsonParser.parse(JsonParser.java:358) 
     at com.google.api.client.json.JsonParser.parse(JsonParser.java:331) 
     at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87) 
     at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81) 
     at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459) 
     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) 
     at com.dgt.ds.MainActivity$1.doInBackground(MainActivity.java:70) 
     at com.dgt.ds.MainActivity$1.doInBackground(MainActivity.java:58) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
     ... 5 more 
     Caused by: java.lang.NumberFormatException: Invalid date/time format: 2013-08-05T10:27:27.449810 
     at com.google.api.client.util.DateTime.parseRfc3339(DateTime.java:301) 
     at com.google.api.client.util.Data.parsePrimitiveValue(Data.java:435) 
     at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:795) 
     ... 17 more 

이 (내가 message_types.DateTimeField을 사용하고 있습니다) 파이썬에서 메시지 객체는 다음과 같습니다

class DResponse(messages.Message): 
    id = messages.StringField(1) 
    created_at = message_types.DateTimeField(2) 
    author = messages.StringField(3) 
    description = messages.StringField(4, required=True) 

나는이 문제를 해결할 수있는 방법?

+0

"DateTimeField"가 구현 된 방식이나 Java 클라이언트 라이브러리의 버그 일 수 있습니다. 동일한 요청에 대한 JSON 페이로드의 모양은 무엇입니까? 'https : // yourappid.appspot.com/_ah/api/explorer'에서 앱용 API 탐색기를 방문하여 테스트해볼 수 있습니다. – bossylobster

+0

@bossylobster 적절한 JSON 응답처럼 보입니다. DateTimeField는''created_at ''입니다 : "2013-08-05T10 : 27 : 27.449000"' –

+0

감사합니다. – bossylobster

답변

3

이는 datetime.datetime 개체의 경우 protorpc.protojson.ProtoJson.encode_fieldusingisoformat이라는 사실 때문에 발생합니다.

이것은 파이썬에서 datetime 모듈이 마이크로 초를 사용하므로 밀리 초 대신에 마이크로 초를 사용하므로 결과적으로 Java 클라이언트 라이브러리 파서가 실패합니다.

  • 정지 DateTimeField를 사용하여 단지를 참조
  • 원숭이 패치를 정수로 protorpc/protojson.py을 타임 스탬프를 보내 고객에 의존, IntegerField를 사용 : 당신은 두 가지 중 하나를 할 수있는 단기 수정에 대한

    정확하게 작동하는 ProtoJson의 서브 클래스. 본질적으로 isoformat()은 사용하지 않아야하며 10 진수 뒤에 3 자리 만있는 하이브리드를 사용해야합니다.
+0

나는이 문제에 대한 해결책을 찾기 위해 어디든지 검색했지만 제안한 것 이외에 다른 것을 찾지 못했습니다. 'datetime.replace (microsecond = 0)'사용도 실패했습니다. – hadware

+0

'protorpc/protojson.py'을 지금 수정해야합니까? 나는 패치가 필요하다고 생각하지 않는다. – bossylobster

+0

아직 생각한 현재 SDK에 오류가 있습니다. – hadware