5

Ich habe das Verfahren unten in App Engine:Google Cloud Endpoints EOFException

@ApiMethod(name = "authed", path = "greeting/authed") 
public HelloGreeting authedGreeting(User user) { 
    ... 
} 

Meine doInBackground Methode in Android AsyncTask:

HelloGreeting hg = null; 
try { 
    hg = service.authed().execute(); 
} catch (IOException e) { 
    Log.d("error", e.getMessage(), e); 
} 
return hg; 

ich die ff Fehler aufgetreten:

/_ah/api/.../v1/greeting/authed: java.io.EOFException 

In logcat:

Problem accessing /_ah/api/.../v1/greeting/authed. Reason: INTERNAL_SERVER_ERROR 
    at java.util.zip.GZIPInputStream.readUByte 
    at java.util.zip.GZIPInputStream.readUShort 
    at java.util.zip.GZIPInputStream.readUShort 

Es funktioniert nur beim Aufruf von Nicht-Auth-Methode. Wie man es repariert?

Ich benutze den lokalen Server.

+0

Ist dies gegen den lokalen Server? –

+0

ja, lokaler Server. –

Antwort

7

Ich stieß auf ein ähnliches Problem mit einem Aufruf für das Einfügen von Werten. Meine unterscheidet sich leicht, weil ich keine Authentifizierung verwende, aber ich bekam die gleiche Ausnahme. Ich benutze appengine-java-sdk-1.8.8. Ich konnte andere Endpunktanrufe mit diesem Fehler durchführen. Ich schaute auf den generierten Code und der Unterschied, den ich mit den funktionierenden Calls gegenüber den nicht funktionierenden Calls sah, war die HttpMethod. Der fehlgeschlagene Anruf wurde als "POST" definiert. Ich konnte dies unter Verwendung des Annotationsattributs httpMethod=ApiMethod.HttpMethod.GET in der @ApiMethod Annotation ändern.

@ApiMethod(httpMethod = ApiMethod.HttpMethod.GET, name = "insertUserArtist", path = "insertUserArtist") 

I regeneriert dann den Client-Code und ich war in der Lage, den Anruf zu machen, ohne die gefürchtete EOFException zu bekommen. Ich bin mir nicht sicher, warum POST nicht richtig funktioniert, aber es in GET geändert hat. Dies wirft möglicherweise einige Fragen darüber auf, wie viele Daten gesendet werden können und adressiert werden sollten (möglicherweise ein Bibliotheksproblem). Ich werde eine Demo-App erstellen, um sie bei Google einzureichen.

+3

Hat jemand eine Idee, warum das funktioniert? – sauce

0

Wenn Sie ein Entity-Objekt übergeben haben, funktioniert der POST. Wenn Sie den primitiven Datentyp übergeben, müssen Sie HttpMethod.GET verwenden.

0

Wenn Sie auf dem lokalen Dev-Server ausgeführt werden, fügen Sie das folgende Snippet in MyApi.Builder hinzu, um es nach dem Festlegen der Root-URL richtig einzurichten.

.setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
       @Override 
       public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { 
        abstractGoogleClientRequest.setDisableGZipContent(true); 
       } 
      }) 

Quelle: https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/HelloEndpoints