【发布时间】: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