2016-04-14 23 views
5

Sử dụng retrofit Tôi muốn thực hiện yêu cầu POST tới http://milzinas.lt/oauthsilent/authorize. URL này là đặc biệt vì nó chuyển hướng bạn đến http://milzinas.e-bros.lt/oauthsilent/authorize. Thiết lập trang bị thêm của tôi sử dụng OkHttpClient. Nếu tôi yêu cầu sử dụng OkHttpClient chỉ thì việc chuyển hướng hoạt động tốt, tức là mã trạng thái 401 được nhận. Tuy nhiên, khi tôi sử dụng cùng một OkHttpClient với trang bị thêm sau đó phản ứng là mã trạng thái 307. Tôi nghĩ rằng điều này có cái gì để làm với thực hiện OkClient mà kết thúc tốt đẹp OkHttpClient nhưng tôi không chắc chắn. Dưới đây là mã tôi đã sử dụng để kiểm tra kịch bản này. Tôi đang sử dụng các thư viện này:OkHttp không chuyển hướng các yêu cầu POST khi được sử dụng với trang bị thêm

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

Tôi hiểu rằng khi URL chuyển hướng bạn đến URL khác, máy khách http phải thực hiện hai yêu cầu. Trong trường hợp của tôi, yêu cầu đầu tiên trả về 307 (Chuyển hướng Tạm thời) và yêu cầu thứ hai trả về 401 (Không được phép). Tuy nhiên, trang bị thêm luôn trả về phản hồi của yêu cầu đầu tiên. Bạn có biết cách chuyển hướng hoạt động đúng cách với trang bị thêm không? Có lẽ tôi có thể đạt được điều này bằng cách sử dụng một số ứng dụng khách HTTP khác? Bất kỳ đề xuất sẽ được đánh giá cao.

Vì vậy, khi tôi thực thi mã bên dưới giao diện điều khiển in

Retrofit failure. Status: 307 
OkHttp. Status: 401 

Tôi muốn nó được

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

Vui lòng nâng cấp lên OkHttp mới hơn. 2.7.5 đã khắc phục được nhiều vấn đề. –

+1

Và OkHttp 3.x thậm chí còn tốt hơn! –

+3

Sự cố vẫn tiếp diễn ngay cả với phiên bản cải tiến mới nhất (2.0.0-beta2) và OkHttp (3.2.0). – Egis

Trả lời

Các vấn đề liên quan