Verwendung retrofit
Ich möchte eine POST-Anfrage an http://milzinas.lt/oauthsilent/authorize
stellen. Diese URL ist speziell, weil sie Sie an http://milzinas.e-bros.lt/oauthsilent/authorize
weiterleitet. Mein Retrofit-Setup verwendet OkHttpClient
. Wenn ich eine Anfrage nur unter Verwendung von OkHttpClient mache, dann funktioniert die Weiterleitung gut, d. H. 401 Statuscode wird empfangen. Wenn ich jedoch den gleichen OkHttpClient mit Retrofit verwende, dann ist die Antwort der Statuscode 307. Ich denke, das hat etwas mit OkClient
Implementierung zu tun, die den OkHttpClient umschließt, aber ich bin mir nicht sicher. Unten ist der Code, den ich verwendet habe, um dieses Szenario zu testen. Ich verwende diese Bibliotheken:OkHttp leitet keine POST-Anfragen um, wenn es mit Nachrüstung verwendet wird
com.squareup.retrofit:retrofit:1.9.0
com.squareup.okhttp:okhttp:2.2.0
Ich verstehe, dass, wenn URL Sie zu einer anderen URL umleitet der HTTP-Client zwei Anforderungen stellen muss. In meinem Fall gibt die erste Anfrage 307 (Temporary Redirect) zurück und die zweite Anfrage 401 (Unauthorized). Die Nachrüstung gibt jedoch immer die Antwort der ersten Anfrage zurück. Weißt du, wie man Umleitungsarbeiten mit Retrofit richtig macht? Vielleicht könnte ich dies mit einem anderen HTTP-Client erreichen? Irgendwelche Vorschläge werden geschätzt. So
, wenn ich Code unter Konsole Drucken ausführen
Retrofit failure. Status: 307
OkHttp. Status: 401
Ich will es
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());
}
});
}
}
Bitte aktualisieren Sie auf eine neuere OkHttp. 2.7.5 hat viele Probleme behoben. –
Und OkHttp 3.x ist noch besser! –
Problem bleibt auch bei den neuesten Retrofit (2.0.0-Beta2) und OkHttp (3.2.0) Versionen bestehen. – Egis