2016-04-14 4 views
5

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()); 
     } 
    }); 
} 

}

+0

Bitte aktualisieren Sie auf eine neuere OkHttp. 2.7.5 hat viele Probleme behoben. –

+1

Und OkHttp 3.x ist noch besser! –

+3

Problem bleibt auch bei den neuesten Retrofit (2.0.0-Beta2) und OkHttp (3.2.0) Versionen bestehen. – Egis

Antwort