来自Retrofit的POST请求以意想不到的方式运行

时间:2017-05-28 16:51:48

标签: http https retrofit2 okhttp3

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

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

为了检查来自Retrospect的POST请求,我已将其指向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 个答案:

答案 0 :(得分:1)

正如评论中已经说明的那样,但为了让其他人更容易理解,这里也会给出答案。

使用带有retrofit重定向的okhttp时,默认情况下会遵循重定向。原因是因为默认的okhttp客户端设置为遵循重定向。这就是为什么你永远不会得到302 - 自动跟踪重定向,你从后面的网址获得200

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

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

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

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

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