【问题标题】:Cannot retry request with a non-repeatable request entity无法使用不可重复的请求实体重试请求
【发布时间】:2012-01-05 14:13:33
【问题描述】:

我在客户端使用 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

我应该怎么做才能避免这种情况?

【问题讨论】:

    标签: java android exception


    【解决方案1】:

    我有一个类似的错误,因为我使用了不可重复的 http 客户端 CountingInputStreamEntity。解决方案是使用 BufferedHttpEntity 将不可重复的 httpclient 转换为可重复的 httpclient。

    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);
    

    【讨论】:

    • 既然 HttpClient 已被弃用,您将如何为 AsyncHttpClient 实施此解决方案?
    【解决方案2】:

    我解决了如下:

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2021-02-02
      • 2012-12-03
      • 2021-12-12
      • 2021-06-22
      • 2020-11-20
      • 2011-02-04
      相关资源
      最近更新 更多