来自 Android 的 Google 云端点 API 调用上的错误 413(请求实体太大)

Error 413 (Request Entity Too Large) on a Google Cloud Endpoints API call from Android

我有一个 Google Cloud Endpoints API 方法如下。

@ApiMethod(name = "setImage", httpMethod = ApiMethod.HttpMethod.POST)
public void setImage(HttpServletRequest httpRequest,
        com.google.appengine.api.users.User appEngineUser,
        @Named("image") String image)
        throws IOException, OAuthRequestException, ForbiddenException,
        com.google.api.server.spi.response.NotFoundException {
    // Write the image text to a pojo and save the pojo in the datastore.
}

我从这个 API 为 iOS 和 Android 生成客户端库。在这两个移动应用程序中,我都使用相机拍照,必要时从相机向下重新采样位图,将其压缩为 JPEG 并使用数据 URI 方案将其编码为字符串。

在 iOS 上,一切正常。我最终上传了大约 436K 个字符。然而,在 Android,我从服务器收到“413(请求实体太大)”HTTP 响应。即使我将图像重新采样到只为 JPEG 发送大约 39K 的点,也会发生这种情况。

为什么? Android 的堆栈跟踪是这样的。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 413 Request Entity Too Large
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
08-24 15:39:26.046  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
08-24 15:39:26.046  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.interceptResponse(AbstractGoogleClientRequest.java:321)
08-24 15:39:26.046  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at cc.biketracker.android.task.SetDeviceBikeImageTask.doInBackground(SetDeviceBikeImageTask.java:45)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at cc.biketracker.android.task.SetDeviceBikeImageTask.doInBackground(SetDeviceBikeImageTask.java:16)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at android.os.AsyncTask.call(AsyncTask.java:288)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-24 15:39:26.047  26980-26980/cc.biketracker.android W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

我认为这是因为您将图像用作 URL 参数而不是资源。我建议将 @Named("image") String image 更改为 SetImageRequest request 并制作一个包含编码字符串的 SetImageRequest class。它可能适用于 iOS 而不是 Android 的原因是因为 iOS 客户端使用 JSON-RPC,它根本不使用 URL 参数。