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