webentwicklung-frage-antwort-db.com.de

Holen Sie sich rohe HTTP-Antwort mit Retrofit

Ich möchte die rohe http-Antwort von meinem API-REST erhalten. Ich habe mit dieser Schnittstelle versucht:

@POST("/login")
@FormUrlEncoded
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass,
                     @Field("appName") String appName, @Field("appKey") String appKey);

Aber ich bekomme:

Java.lang.IllegalArgumentException: Es kann kein Aufrufadapter für .__ erstellt werden. retrofit.Call für die Methode Api.login

Ich erstelle Retrofit so:

Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
37
Héctor

Um auf die rohe Antwort zuzugreifen, verwenden Sie ResponseBody von okhttp als Ihren Anruftyp. 

Call<ResponseBody> login(...)

In Ihrem Rückruf können Sie den Antwortcode mit der code-Methode der Antwort überprüfen. Dies gilt für jeden Retrofit 2-Rückgabetyp, da Ihr Callback immer eine Response erhält, die mit Ihrem tatsächlichen Rückgabetyp parametrisiert ist. Für asynchron - 

Call<ResponseBody> myCall = myApi.login(...)
myCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
        // access response code with response.code()
        // access string of the response with response.body().string()
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
});

für synchrone Anrufe - 

Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
62
iagreen

Über Interceptors können Sie Informationen über Header, Antwortcode und den reinen Json-Antworttext erhalten. Sie können Ihre eigenen Interceptors schreiben, aber ich bevorzuge den eigenen Logging-Interceptor von Square. Es ist auf Maven Central verfügbar.

compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

So verwenden Sie es

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor).build();

Die Protokollierungsstufe BODY druckt Kopfzeilen zur Antwort des Körpers. Und in deinem Retrofit

Retrofit retrofit = new Retrofit.Builder()
            .client(client)               
            .baseUrl("https://yourapi.com/api/")
            .build();

Öffnen Sie jetzt Log Cat und Sie erhalten eine unvollständige HTTP-Antwort.

Vorsicht!

Vergessen Sie nicht, Interceptors in der Produktion zu entfernen (oder den Logging Level auf NONE zu ändern)! Andernfalls können Personen Ihre Anfrage und Antwort in Log Cat sehen.

25
aldok

Ich hatte das gleiche Problem, aber eine andere Lösung. Ich nahm die Anfrage und schickte sie mit OkHttp3Client. So was:

//raw text 
Request request = call.clone().request();
OkHttpClient client = new OkHttpClient();
okhttp3.Response test = client.newCall(request).execute();
System.out.println(test.body().string());

quelle: http://robinhenniges.com/de/retrofit-2-raw-response

0
Rob Anderson