Невозможно повторить запрос с неповторяющимся объектом запроса
Я использую библиотеку java-http-client и Apache Transport с ней на стороне клиента и Rails на стороне сервера. Время от времени получаю ошибку вроде этого:
11-24 17:37:02.469: WARN/BaseActivity(5925): org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.google.api.client.http.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:58)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:639)
at com.sk.api.SkClient.updateUser(SkClient.java:157)
at com.sk.api.SkClient$3.call(SkClient.java:76)
at com.sk.api.SkClient$3.call(SkClient.java:71)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:413)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
... 12 more
Что я должен сделать, чтобы избежать этого?
2 ответа
Решение
У меня есть похожая ошибка, потому что я использовал CountingInputStreamEntity, который является неповторяемым http-клиентом. Решение состояло в том, чтобы использовать BufferedHttpEntity, который преобразовал неповторяемый в повторяемый http client.
ParcelFileDescriptor fileDescriptor = this.getContentResolver().openFileDescriptor(uri, "r");
InputStream in = this.getContentResolver().openInputStream(uri);
CountingInputStreamEntity entity = new CountingInputStreamEntity(in, fileDescriptor.getStatSize());
entity.setUploadListener(this);
entity.setContentType("binary/octet-stream");
entity.setChunked(true);
BufferedHttpEntity myEntity = null;
try {
myEntity = new BufferedHttpEntity(entity);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
put.setEntity(myEntity);
Извините за мой плохой английский
Я решил это следующим образом:
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
ContentType contentType = ContentType.create("image/jpeg", Consts.ISO_8859_1);
entityBuilder.addBinaryBody(PARAM_ATTACHMENT, new File(filepath), contentType, StringUtils.getFileName(filepath));