Я использую «Модернизацию» для выполнения базового запроса POST, и я предоставляю базовое @Body для запроса.Модернизация POST-запроса с базовой HTTP-аутентификацией: «Не удается перезапустить потоковый объект HTTP»
@POST("/rest/v1/auth/login")
LoginResponse login(@Body LoginRequest loginRequest);
Когда я создаю интерфейс для Модернизированного я обеспечиваю свою собственную OkHttpClient, и все, что я делаю для него добавляет свою собственную пользовательскую проверку подлинности:
@Provides
@Singleton
public Client providesClient() {
OkHttpClient httpClient = new OkHttpClient();
httpClient.setAuthenticator(new OkAuthenticator() {
@Override
public Credential authenticate(Proxy proxy, URL url, List<Challenge> challenges) throws IOException {
return getCredential();
}
@Override
public Credential authenticateProxy(Proxy proxy, URL url, List<Challenge> challenges) throws IOException {
return getCredential();
}
});
return new OkClient(httpClient);
}
это работает здорово, когда я посылаю запросы непосредственно OKHttp и другими запросы GET с дооснащением, но когда я использую переоснащение сделать запрос POST, я получаю следующее сообщение об ошибке:
Caused by: java.net.HttpRetryException: Cannot retry streamed HTTP body
at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:324)
at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:508)
at com.squareup.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:94)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:49)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:357)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282)
at $Proxy3.login(Native Method)
at com.audax.paths.job.LoginJob.onRunInBackground(LoginJob.java:41)
at com.audax.library.job.AXJob.onRun(AXJob.java:25)
at com.path.android.jobqueue.BaseJob.safeRun(BaseJob.java:108)
at com.path.android.jobqueue.JobHolder.safeRun(JobHolder.java:60)
at com.path.android.jobqueue.executor.JobConsumerExecutor$JobConsumer.run(JobConsumerExecutor.java:172)
at java.lang.Thread.run(Thread.java:841)
Я играл с ним. Если я удалю аутентификацию и укажу на сервер, который не требует проверки подлинности, то он отлично работает.
- Поэтому я должен отправить информацию.
- Получение запроса на проверку подлинности.
- Реагирование на вызов.
- Пытается повторно отправить запрос еще раз, а затем выдается ошибка.
Не знаете, как обойти это. Любая помощь будет замечательной.
Работали как очарование. Огромное спасибо. Я несколько секунд стучал головой о стену. :-) – spierce7
@ Джесс Уилсон (или это @ jesse-wilson) У меня такая же проблема в OkHttp. Есть ли у вас рекомендация, если я не пользуюсь Retrofit? Спасибо – cottonBallPaws
@cottonBallPaws, вы можете вручную повторить запрос, когда есть проблема с аутентификацией. –