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());
}
});
}
}
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 đề. –
Và OkHttp 3.x thậm chí còn tốt hơn! –
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