如何在Android中的“Cloud Endpoints”构建器中禁用GZipContent

时间:2013-03-13 18:19:03

标签: android google-cloud-endpoints

我想为Google Cloud Endpoints类禁用GZipContent,以便POST可以在本地开发服务器上运行。

最新的GPE版本生成此端点构建器:

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

并且Google文档建议像这样使用它:

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

有谁知道如何为端点禁用GZipContent?

感谢。

3 个答案:

答案 0 :(得分:11)

您可以使用:

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

TictactoeRequest替换为适合您应用的类。

答案 1 :(得分:1)

我不是百分之百为什么Dan的回答对我不起作用,但是GitHub project's code为我解决了这个问题。

/*
 * 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;
}

答案 2 :(得分:0)

对于那些谷歌搜索我看到的错误,它是java.io.EOFException,但只在开发服务器。以下是我如何解决这个问题,使用OP的问题中所述的例子:

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();

这可能比其他有用的答案更简单。