2015-07-01 16 views
0

我正在爲我的應用程序的API發佈Post請求,當我在Nexus 5上執行此操作時,一切都很順利,但是當我在HTC One X上執行此請求或三星Galaxy S3,我得到以下錯誤:@Post請求的I/O錯誤Android註釋

07-01 11:48:36.605 30101-30251/eu.package.name E/AndroidRuntime﹕ FATAL EXCEPTION: pool-4-thread-3 
    org.springframework.web.client.ResourceAccessException: I/O error: null; nested exception is java.io.EOFException 
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491) 
      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439) 
      at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:415) 
      at eu.package.name.Rest.RESTClient_.signinFacebook(RESTClient_.java:155) 
      at eu.package.name.Models.User.userLoginFacebook(User.java:91) 
      at eu.package.name.Models.User_.access$101(User_.java:14) 
      at eu.package.name.Models.User_$2.execute(User_.java:65) 
      at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:393) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153) 
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
      at java.lang.Thread.run(Thread.java:841) 
    Caused by: java.io.EOFException 
      at libcore.io.Streams.readAsciiLine(Streams.java:203) 
      at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:579) 
      at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:827) 
      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) 
      at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) 
      at com.splunk.mint.network.http.MonitorableHttpURLConnection.getResponseCode(MonitorableHttpURLConnection.java:362) 
      at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:54) 
      at org.springframework.http.client.SimpleClientHttpResponse.getStatusCode(SimpleClientHttpResponse.java:80) 
      at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:46) 
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:477) 
            at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439) 
            at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:415) 
            at eu.package.name.Rest.RESTClient_.signinFacebook(RESTClient_.java:155) 
            at eu.package.name.Models.User.userLoginFacebook(User.java:91) 
            at eu.package.name.Models.User_.access$101(User_.java:14) 
            at eu.package.name.Models.User_$2.execute(User_.java:65) 
            at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:393) 
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153) 
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
            at java.lang.Thread.run(Thread.java:841) 

我做的請求爲:

@Post("/signin/facebook") 
LoginResponse signinFacebook(FacebookLoginRequest facebookLoginRequest); 

我已經嘗試過禁用保活通過執行以下操作:

restClient.setHeader("Connection", "Close"); 
LoginResponse loginResponse = restClient.signinFacebook(facebookLoginRequest); 
+0

退房[這](http://stackoverflow.com/questions/13182519/spring-rest-template-usage -causes-eofexception)問題。 – WonderCsabo

回答

3

我建議嘗試一下okhttp客戶端:

@Rest(rootUrl = "url", requestFactory = OkHttpClientHttpRequestFactory.class) 

這應該可以解決很多涉及到標準的Android HTTP客戶端的問題,包括這一個。請注意,OkHttpClientHttpRequestFactory僅適用於Spring Android 2.0。

編輯:您必須聲明以下依存使用OkHttpClientHttpRequestFactory

compile "org.springframework.android:spring-android-rest-template:2.0.0.M2" 
compile "com.squareup.okhttp:okhttp:2.4.0" 
compile "com.squareup.okhttp:okhttp-urlconnection:2.4.0" 
+0

我從Android Studio收到消息:「無法解析符號'OkHttpClientHttpRequestFactory'」 –

+0

正如我所說的,您必須使用Spring for Android 2.0。 – WonderCsabo

+0

我爲Android 2.0使用Spring,但現在使用HttpComponentsClientHttpRequestFactory而不是OkHttpClientHttpRequestFactory,它現在可以很好地工作!謝謝! –