【问题标题】:POST request from Retrofit works in unexpected way来自 Retrofit 的 POST 请求以意想不到的方式工作
【发布时间】:2017-10-29 00:19:38
【问题描述】:

有一个使用 HTTPS 的第三方网站,其起始页在登录时执行 POST。我已经在浏览器中检查了该 POST 请求,然后我能够使用 Fiddler 的作曲家手动创建请求。因此,根据凭据,我可以成功或不成功地使用 Fiddler 登录。返回代码始终为 302,它分别伴随着重定向(标题“位置”)到用户管理页面或登录失败页面。

但是,当我使用 Retrofit 库创建该请求时,它不起作用。我得到响应代码 200,在这种特定情况下不被视为成功。

为了检查来自 Retrospect 的 POST 请求,我已将其定向到 Fiddler (http://localhost:8888) 而不是第三方 URL。如果我将该请求复制到作曲家并将 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)
}

【问题讨论】:

  • 我猜您正在使用带有OkHttp 的改造,默认情况下followRedirects 设置为true,因此您永远不会得到302,因为默认情况下会遵循重定向。一个简单的检查方法是通过将 followRedirect 属性设置为 false 来使用自定义 OkHttpClient 初始化改造。如果我没记错的话,有两个,如果我没记错的话,还有一个用于 Https 请求。试试看,让我们知道。
  • 像魅力一样工作!你可以发表你的评论作为答案,我会接受它是正确的。

标签: http https retrofit2 okhttp3


【解决方案1】:

正如 cmets 中已经说明的那样,但为了让其他人也更容易理解,这里有一个答案。

当使用retrofitokhttp 时,默认情况下会遵循重定向。这是因为默认的okhttp 客户端设置为遵循重定向。这就是为什么你永远不会得到 302 的原因 - 重定向会自动被跟踪,你会从被跟踪的 url 中得到 200

您可以通过使用正确配置的 okhttp 客户端构建改造实例来禁用此行为:

OkHttpClient client = new OkHttpClient.Builder()
            .followRedirects(false)
            .followSslRedirects(false)
            .build();

Retrofit retrofit = new Retrofit.Builder()
            .client(client)
            // other configurations for retrofit
            .build();

请注意,我们在这里创建了一个改造实例,客户端配置 not 以遵循重定向。这将有效地使您收到302 和其他重定向代码。

(请注意,我这里没有完全配置改造实例,以便将答案集中在重要部分)

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多