Ошибка 413 (слишком большой объект запроса) при вызове API конечных точек Google Cloud с Android

У меня есть метод API конечных точек Google Cloud следующим образом.

@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.
}

Я генерирую клиентские библиотеки для iOS и Android из этого API. В обоих мобильных приложениях я использую камеру, чтобы сделать снимок, при необходимости передискретизирую растровое изображение с камеры, сжимаю его в JPEG и кодирую в виде строки, используя схему URI данных.

На iOS все это работает просто отлично. В итоге я загружаю около 436 тысяч символов. Однако на Android я получаю HTTP-ответ «413 (Request Entity Too Large)» с сервера. Это происходит, даже если я передискретизирую изображение вплоть до точки, когда я отправляю только около 39 КБ для 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)

person Eliot    schedule 24.08.2015    source источник
comment
ИМО, дополнительную информацию об этой ошибке можно найти здесь. 413 Request Entity Too Large "The size of serialized JSON representation of the pipeline exceeds the allowable limit" "Failed to create a workflow job: Invalid JSON payload received" "Failed to create a workflow job: Request payload exceeds the allowable limit"   -  person BNK    schedule 24.08.2015
comment
Ваша ссылка ведет на другой Google SDK. Я не использую Dataflow здесь.   -  person Eliot    schedule 24.08.2015


Ответы (1)


Я полагаю, это потому, что вы используете изображение как параметр URL, а не как ресурс. Я бы предложил изменить @Named("image") String image на SetImageRequest request и создать класс SetImageRequest, содержащий закодированную строку. Причина, по которой он, вероятно, работает на iOS, а не на Android, заключается в том, что клиент iOS использует JSON-RPC, который вообще не использует параметры URL.

person saiyr    schedule 24.08.2015