来自 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 参数。
我有一个 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 参数。