Android客户端http请求使用的InputStreamEntity抛出异常ClientProtocolException解决办法

来源:互联网 发布:淘宝卖家评论回复语 编辑:程序博客网 时间:2024/05/21 23:02

参考http://blog.csdn.net/wudiwo/article/details/9339445


上文中描述的

1.1.7 生成实体内容

HttpClient提供一些类,它们可以用于生成通过HTTP连接获得内容的有效输出流。为了封闭实体从HTTP请求中获得的输出内容,那些类的实例可以和封闭如POST和PUT请求的实体相关联。HttpClient为很多公用的数据容器,比如字符串,字节数组,输入流和文件提供了一些类:StringEntity,ByteArrayEntity,InputStreamEntity和FileEntity。

File file = new File("somefile.txt");
FileEntity entity = new FileEntity(file, "text/plain; charset=\"UTF-8\"");
HttpPost httppost = new HttpPost("http://localhost/action.do");
httppost.setEntity(entity);

请注意InputStreamEntity是不可重复的,因为它仅仅能从低层数据流中读取一次内容。通常来说,我们推荐实现一个定制的HttpEntity类,这是自我包含式的,用来代替使用通用的InputStreamEntity。FileEntity也是一个很好的起点。



描述的很清楚,InputStreamEntity是无法重试的,只要重试,通过源码可以看到,其isRepeatable()属性返回的是false,从而抛出了一个ClientProtocolException。由于InputStreamEntity本身设计成这样,对其属性的更改不是一个好的办法,google了一些文章,比较推荐的是使用ByteArrayEntity来代替InputStreamEntity。由于服务器端从这两者中获取数据得到的是一样的,因此对服务器端不需要做修改。只是需要将InputStreamEntity的入参(inputStream,int)变成(byte[])即可。


具体报错信息为:

06-15 19:46:04.687  1453  3121 W System.err: org.apache.http.client.ClientProtocolException
06-15 19:46:04.687  1453  3121 W System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:597)
06-15 19:46:04.687  1453  3121 W System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:518)
06-15 19:46:04.687  1453  3121 W System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:496)

06-15 19:46:04.687  1453  3121 W System.err:  at com.funambol.syncml.spds.SyncManager.sync(SyncManager.java:610)
06-15 19:46:04.687  1453  3121 W System.err:  at com.funambol.client.engine.SyncEngine.fireSync(SyncEngine.java:606)
06-15 19:46:04.687  1453  3121 W System.err:  at com.funambol.client.engine.SyncEngine$SyncThread.synchronize(SyncEngine.java:530)
06-15 19:46:04.687  1453  3121 W System.err:  at com.funambol.client.engine.SyncEngine$SyncThread.sync(SyncEngine.java:443)
06-15 19:46:04.687  1453  3121 W System.err:  at com.funambol.client.engine.SyncEngine$SyncThread.run(SyncEngine.java:421)
06-15 19:46:04.687  1453  3121 W System.err: Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
06-15 19:46:04.687  1453  3121 W System.err:  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:429)
06-15 19:46:04.687  1453  3121 W System.err:  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:595)
06-15 19:46:04.687  1453  3121 W System.err:  ... 14 more
06-15 19:46:04.687  1453  3121 E SyncManager: SyncException
06-15 19:46:04.687  1453  3121 E SyncManager: com.funambol.sync.SyncException: java.io.IOException: org.apache.http.client.ClientProtocolException
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.syncml.spds.SyncManager.postRequest(SyncManager.java:1060)
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.syncml.spds.SyncManager.sync(SyncManager.java:610)
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.client.engine.SyncEngine.fireSync(SyncEngine.java:606)
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.client.engine.SyncEngine$SyncThread.synchronize(SyncEngine.java:530)
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.client.engine.SyncEngine$SyncThread.sync(SyncEngine.java:443)
06-15 19:46:04.687  1453  3121 E SyncManager:  at com.funambol.client.engine.SyncEngine$SyncThread.run(SyncEngine.java:421)
06-15 19:46:04.727  1453  3121 D syncTime: sync saveSyncStatus use tiem=101638
06-15 19:46:04.727  1453  3121 D SyncManager: syncMode = 202, cancel=false, isFailed=true
06-15 19:46:04.727  1453  3121 D SyncLog : [CommonBaseUIController] -----------------endSession for failed

0 0
原创粉丝点击