来自Android的Google Cloud Endpoints API错误413(请求实体太大)

我有一个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,并使用数据URIscheme将其编码为string。

在iOS上,这一切工作得很好。 我最终上传了大约436K个字符。 然而,在Android上,我从服务器上得到一个“413(Request Entity Too Large)”的HTTP响应。 这种情况发生,即使我重新采样图像的权利,直到我只发送约39K的JPEG的点。

为什么? 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$1.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$2.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$1.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参数而不是资源。 我build议将@Named("image") String image更改为SetImageRequest request并创build一个包含编码string的SetImageRequest类。 它可能适用于iOS而不是Android的原因是iOS客户端使用JSON-RPC,它根本不使用URL参数。