2017-05-28 52 views
1

有一個第三方網站使用HTTPS,並且在登錄時起始頁執行POST。我在瀏覽器中檢查了POST請求,然後我可以用Fiddler的作曲家手動創建請求。因此,根據憑證,我可以成功或不成功使用Fiddler登錄。返回碼始終爲302,它們分別與用戶管理頁面的重定向(標題「位置」)或登錄失敗頁面一起出現。Retrofit的POST請求以意想不到的方式工作

但是,當我使用Retrofit庫創建該請求時,它不起作用。我得到的響應代碼爲200,在這種情況下不會被視爲成功。

爲了檢查來自Retrospect的POST請求,我將它指向了Fiddler(http://localhost:8888)而不是第三方URL。如果我將該請求複製到作曲家,並將URL調整爲第三方URL,則該請求確實有效。也就是說,我無法找到由Retrofit構建的請求有任何問題。

有沒有人有一個想法是什麼可能是錯的?

我的代碼寫在科特林,但應該是很容易理解,如果你知道的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

我猜你正在使用改裝用''OkHttp''默認情況下它在具有' 'followRedirects''設置爲true,所以你永遠不會得到302,因爲重定向是默認的。一個簡單的方法來檢查這是通過設置「followRedirect」屬性爲false來初始化自定義「OkHttpClient」的改造。如果我沒有記錯的話,有2個,如果我沒有記錯的話,也有一個是Https請求。試試看,讓我們知道。 – Fred

+0

工程就像一個魅力!你可以發表你的評論作爲答案,我會接受它是正確的。 –

回答

1

正如已經在註釋中規定,而是使之更容易理解別人太在這裏不用回答。

使用retrofitokhttp重定向後將默認使用。原因是因爲默認的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和其他重定向代碼。

(請注意,我沒有完全在這裏配置的改裝實例集中在重要的部分答案)