POST-запрос от Retrofit работает неожиданно
Существует сторонний веб-сайт, который использует HTTPS и где стартовая страница выполняет POST при входе в систему. Я проверил этот запрос POST в своем браузере, а затем я смог вручную создать запрос с помощью композитора Fiddler. Таким образом, в зависимости от учетных данных, я мог либо успешно, либо неудачно войти в систему с помощью Fiddler. Код возврата всегда 302, который сопровождается либо перенаправлением (заголовок "Местоположение") на страницу управления пользователями, либо на страницу с ошибкой входа, соответственно.
Однако когда я создаю этот запрос с использованием библиотеки Retrofit, он не работает. Я получаю код ответа 200, который в данном конкретном случае не следует считать успешным.
Чтобы проверить запрос POST от Retrospect, я направил его в Fiddler ( http://localhost:8888/) вместо стороннего URL. Если я скопирую этот запрос в композитор и изменим URL-адрес на сторонний, запрос будет работать. Т.е. я не смог найти ничего плохого в запросе, построенном Retrofit.
У кого-нибудь есть идея, что может быть не так?
Мой код написан на Kotlin, но должен быть легко понятен, если вы знаете Java:
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.http.*
interface MyApi {
@POST("<relative login url>")
@FormUrlEncoded
@Headers(
//...
)
fun login(
@Field("username") username: String,
@Field("password") password: String
) : Call<ResponseBody>;
}
fun main(args: Array<String>) {
val baseUrl = "https://<url>"
val retrofit = Retrofit.Builder().baseUrl(baseUrl).build()
val myApi = retrofit.create(MyApi::class.java)
val code = myApi.login("<username>", "<password>").execute().code()
println(code)
}
1 ответ
Как уже говорилось в комментариях, но для того, чтобы сделать его более понятным для других, здесь приводится ответ.
Когда используешь retrofit
с okhttp
перенаправления будут следовать по умолчанию. Причина этого заключается в том, что по умолчанию okhttp
клиент настроен на перенаправление. Вот почему вы никогда не получите 302
- Перенаправление выполняется автоматически, и вы получаете 200
из последующего URL.
Вы можете отключить это поведение, создав свой экземпляр модификации с правильно настроенным клиентом okhttp:
OkHttpClient client = new OkHttpClient.Builder()
.followRedirects(false)
.followSslRedirects(false)
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(client)
// other configurations for retrofit
.build();
Обратите внимание, что здесь мы создаем экземпляр дооснащения с настройкой клиента, чтобы не выполнять перенаправления. Это эффективно заставит вас получить 302
и другие коды перенаправления.
(обратите внимание, что я не полностью настроил экземпляр модификации здесь, чтобы сосредоточить ответ на важной части)