2016-04-14 28 views
5

使用retrofit我想向http://milzinas.lt/oauthsilent/authorize發出POST請求。這個URL很特殊,因爲它會將您重定向到http://milzinas.e-bros.lt/oauthsilent/authorize。我的改裝設置使用OkHttpClient。如果我只使用OkHttpClient發出請求,則重定向工作正常,即收到401狀態碼。然而,當我使用相同的OkHttpClient進行改造時,則響應是狀態碼307。我認爲這與實現有關,它包裝了OkHttpClient,但我不確定。以下是我用來測試這種情況的代碼。我正在使用這些庫:OkHttp在與改造一起使用時不重定向POST請求

com.squareup.retrofit:retrofit:1.9.0 
com.squareup.okhttp:okhttp:2.2.0 

據我所知,當URL重定向到另一個URL時,http客戶端必須發出兩個請求。在我的情況下,第一個請求返回307(臨時重定向),第二個請求返回401(未授權)。但是,翻新總是返回第一個請求的響應。你知道如何使改造工作正確進行重定向嗎?也許我可以通過使用其他HTTP客戶端來實現這一點?任何建議將不勝感激。

所以,當我在下面控制檯打印執行代碼

Retrofit failure. Status: 307 
OkHttp. Status: 401 

我想這是

Retrofit failure. Status: 401 
OkHttp. Status: 401 

public class MainActivity extends AppCompatActivity { 

interface Api { 

    @POST(URL) 
    @Headers("Accept: application/json") 
    void test(@Body Object dummy, Callback<Object> callback); 

} 

static final String BASE_URL = "http://milzinas.lt"; 
static final String URL = "/oauthsilent/authorize"; 

final OkHttpClient okHttpClient = new OkHttpClient(); 
Api api; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    RestAdapter retrofit = new RestAdapter.Builder() 
      .setEndpoint(BASE_URL) 
      .setClient(new OkClient(okHttpClient)) 
      .setConverter(new Converter() { 
       @Override 
       public Object fromBody(TypedInput body, Type type) throws ConversionException { 
        return null; 
       } 

       @Override 
       public TypedOutput toBody(Object object) { 
        return null; 
       } 
      }) 
      .build(); 

    api = retrofit.create(Api.class); 

    makeRequestOkHttp(); 
    makeRequestRetrofit(); 
} 

void makeRequestOkHttp() { 
    new AsyncTask<Object, Object, Object>() { 
     @Override 
     protected Object doInBackground(Object... objects) { 
      try { 
       Request request = new Request.Builder().url(BASE_URL + URL).build(); 
       com.squareup.okhttp.Response response = okHttpClient.newCall(request).execute(); 
       android.util.Log.d("matka", "OkHttp. Status: " + response.code()); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 

      return null; 
     } 
    }.execute(); 
} 

void makeRequestRetrofit() { 
    api.test("", new Callback<Object>() { 
     @Override 
     public void success(Object o, Response response) { 
      android.util.Log.d("matka", "Retrofit success. Status: " + response.getStatus()); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      android.util.Log.d("matka", "Retrofit failure. Status: " + error.getResponse().getStatus()); 
     } 
    }); 
} 

}

+0

請升級到最新OkHttp。 2.7.5已經修復了很多問題。 –

+1

OkHttp 3.x更好! –

+3

即使使用最新的翻新版(2.0.0-beta2)和OkHttp(3.2.0)版,問題仍然存在。 – Egis

回答