2013-03-13 5 views
7

Voglio disabilitare GZipContent per una classe Google Cloud Endpoint in modo che un POST possa funzionare sul server di sviluppo locale.Come disabilitare GZipContent nel builder Cloud Endpoint in Android

L'ultima versione GPE genera questo costruttore endpoint:

public static final class Builder extends AbstractGoogleJsonClient.Builder { 
    public Builder(HttpTransport transport, JsonFactory jsonFactory, 
     HttpRequestInitializer httpRequestInitializer) { 
     super(
      transport, 
      jsonFactory, 
      ...); 
    } 

e la documentazione Google consiglia di utilizzare in questo modo:

Myendpoint.Builder endpointBuilder = new Myendpoint.Builder(
        AndroidHttp.newCompatibleTransport(), 
        new GsonFactory(), 
        credential); 

Qualcuno sa come disattivare GZipContent per l'endpoint?

Grazie.

risposta

11

È possibile utilizzare:

builder.setGoogleClientRequestInitializer(new TictactoeRequestInitializer() { 
    protected void initializeTictactoeRequest(TictactoeRequest<?> request) { 
     request.setDisableGZipContent(true); 
    } 
    }); 

Sostituire TictactoeRequest con la classe appropriata per l'applicazione.

+0

Grazie Dan! Sembra giusto (ho notato il controllo in xxxxxRequestInitializer ma non ero sicuro di come usarlo). Lo proverò più tardi quando avrò finito il mio lavoro di giorno e accetterò la risposta. – aez

1

Non sono al 100% perché la risposta di Dan non ha funzionato per me, ma questo GitHub project's code ha risolto per me.

/* 
* TODO: Need to change this to 'true' if you're running your backend locally using 
* the DevAppServer. See 
* http://developers.google.com/eclipse/docs/cloud_endpoints for more 
* information. 
*/ 
protected static final boolean LOCAL_ANDROID_RUN = false; 

/* 
* The root URL of where your DevAppServer is running (if you're running the 
* DevAppServer locally). 
*/ 
protected static final String LOCAL_APP_ENGINE_SERVER_URL = "http://localhost:8080/"; 

/* 
* The root URL of where your DevAppServer is running when it's being 
* accessed via the Android emulator (if you're running the DevAppServer 
* locally). In this case, you're running behind Android's virtual router. 
* See 
* http://developer.android.com/tools/devices/emulator.html#networkaddresses 
* for more information. 
*/ 
protected static final String LOCAL_APP_ENGINE_SERVER_URL_FOR_ANDROID = "http://10.0.2.2:8080"; 

/** 
* Updates the Google client builder to connect the appropriate server based 
* on whether LOCAL_ANDROID_RUN is true or false. 
* 
* @param builder Google client builder 
* @return same Google client builder 
*/ 
public static <B extends AbstractGoogleClient.Builder> B updateBuilder(
     B builder) { 
    if (LOCAL_ANDROID_RUN) { 
     builder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL_FOR_ANDROID 
       + "/_ah/api/"); 
    } 

    // only enable GZip when connecting to remote server 
    final boolean enableGZip = builder.getRootUrl().startsWith("https:"); 

    builder.setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
     public void initialize(AbstractGoogleClientRequest<?> request) 
       throws IOException { 
      if (!enableGZip) { 
       request.setDisableGZipContent(true); 
      } 
     } 
    }); 

    return builder; 
} 
0

Per coloro che sono Googling per l'errore che ho visto, era java.io.EOFException, ma solo nel server di sviluppo. Ecco come sono stato in grado di risolvere questo problema, utilizzando l'esempio indicato nella domanda del PO:

Myendpoint myendpointClient = new Myendpoint.Builder(
       AndroidHttp.newCompatibleTransport(), 
       new GsonFactory(), 
       credential).build(); 
EndpointService svcCall = myendpointClient.endpointService("firstArg"); 
// Note, I didn't call "execute()", as normal! 
svcCall.setDisableGZipContent(true); 
// This is also a handy place to set http headers, etc 
svcCall.getRequestHeaders().set("x-oddballhdr","OddballValue"); 
// It's now time to call execute() 
svcCall.execute(); 

che può essere un po 'più semplice rispetto alle altre risposte utili.