Erhalten Sie mit Retrofit rohe HTTP-Antworten

Lesezeit: 3 Minuten

Benutzer-Avatar
Tyrannisieren

Ich möchte die rohe HTTP-Antwort von meiner API REST erhalten. Ich habe es 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: Anrufadapter für „retrofit.Call“ für Methode „Api.login“ kann nicht erstellt werden

Ich erschaffe Retrofit Hier entlang:

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

Benutzer-Avatar
grün

Um Zugriff auf die Rohantwort zu erhalten, verwenden Sie ResponseBody von okhttp als Ihr Anruftyp.

Call<ResponseBody> login(...)

In Ihrem Rückruf können Sie den Response-Code mit dem überprüfen code Methode der Antwort. Dies gilt für alle Rückgabetypen von Retrofit 2, da Ihr Callback immer a erhält Response mit Ihrem tatsächlichen Rückgabetyp parametriert. 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 Aufrufe —

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

  • Aber das ist der Antwortkörper. Was ist, wenn ich den HTTP-Antwortcode überprüfen möchte?

    – Hektor

    26. Oktober 2015 um 14:53 Uhr

  • Sie erhalten immer eine Response Objekt, von dem aus Sie den http-Code überprüfen können. Siehe aktualisierte Antwort.

    – grün

    26. Oktober 2015 um 15:39 Uhr

  • Vielen Dank. Gibt es eine Möglichkeit, das Response-Objekt asynchron zu machen?

    – Hektor

    26. Oktober 2015 um 15:41 Uhr

  • Ja, Sync vs. Async ist nicht mehr in der Schnittstelle kodiert. Sie können pro Anruf entscheiden. enqueue wie oben verwendet, ist asynchron. Wenn Sie es synchron wollen, würden Sie verwenden execute ohne Rückruf – Response myResponse = myCall.execute();

    – grün

    26. Oktober 2015 um 15:46 Uhr

  • response.body().string(): Methodenstring kann nicht aufgelöst werden

    – Kairat Doshekenov

    26. Mai 2018 um 7:21 Uhr

Sie können Informationen über Header, Antwortcode bis hin zum rohen JSON-Antworttext abrufen, indem Sie verwenden Abfangjäger. Sie können Ihre benutzerdefinierten Interceptors schreiben, aber ich bevorzuge die Verwendung von Squares eigenem Logging Interceptor. Es ist auf Maven Central verfügbar.

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

Hier erfahren Sie, wie Sie es verwenden

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

Die Protokollierungsebene BODY druckt Header in die Body-Antwort. Und in Ihrem Retrofit

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

Öffnen Sie jetzt Log Cat und Sie sehen eine rohe HTTP-Antwort.

Vorsicht!

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

  • kannst du mir sagen was an meinem Code falsch ist? weil es nicht funktioniert imgur.com/a/yKvfS

    – zihadrizkyef

    2. August 2017 um 3:24 Uhr

  • @zihadrizkyef: Setzen Sie für alle Fälle Ihre Protokollebene in Ihrer LogCat auf “Ausführlich”.

    – matteoh

    23. November 2017 um 19:39 Uhr


Ich hatte das gleiche Problem aber eine andere Lösung. Ich habe die Anfrage angenommen und mit OkHttp3Client gesendet. 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

  • Wenn ich diese Antwort nur gesehen hätte, bevor ich meinen gesamten Code geändert hätte ResponseBody Typ. Danke mein Herr

    – Fehler passieren

    27. April 2020 um 7:29 Uhr


  • Danke vielmals! Das hat meinen Tag gerettet. Vorschlag: Ich denke, es ist besser, wenn Sie .string() innerhalb eines Try-Catch-Blocks verwenden.

    – Dinith Rukshan Kumara

    8. Oktober 2021 um 20:43 Uhr

1090260cookie-checkErhalten Sie mit Retrofit rohe HTTP-Antworten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy