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

标签 http https retrofit2 okhttp

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

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

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

最佳答案

如评论中所述,但为了让其他人也更容易理解,这里有一个答案。

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();

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

(注意我这里没有完全配置retrofit实例,把答案集中在重要部分)

关于http - 来自 Retrofit 的 POST 请求以意想不到的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44229798/

相关文章:

ruby - 瘦服务器未超时

java - 在http get params中传递 "long"值

JavaScript 不安全访问?

javascript - React Native 允许使用 axios 自签名证书

php - 我的表格安全吗?

java - 从 Android Retrofit2 发布嵌套对象,服务器接收子元素 null

android - 如何正确地将变量放入 url 中。改造2.0

http - 为什么我们可以使用telnet 来连接http 或memcached?

java - HTTP 错误代码,导致 IOException - 如何访问响应?

android - 如何在 Android 中使用 woocommerce Api 改造实现 OAuth 1.0a