来自Retrofit的POST请求以意想不到的方式工作

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

但是,当我使用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) } 

正如评论中已经指出的那样,为了让别人更容易理解,在这里可以得到答案。

当使用okhttp重定向使用retrofit将被默认。 原因是因为默认的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和其他重定向代码。

(请注意,我并没有完全配置翻新实例,将重点放在重要的部分)