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