Ich ziehe von Volley zu Retrofit, derzeit Version 2.0.
Wie drucke ich den vollständigen Json-Antwortcode aus?
beinhaltet :
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
RestClient :
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
return response;
}
});
Gson gson = new GsonBuilder()
.setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ROOT)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
REST_CLIENT = retrofit.create(APIService.class);
APIService :
@GET("my/json")
Call<Model> getFeed();
In Aktivität - API aufrufen :
Call<Model> call = RestClient.get().getFeed();
call.enqueue(new Callback<Model>() {
@Override
public void onResponse(Response<Model> response, Retrofit retrofit) {
Log.w("2.0 getFeed > response.raw() => ", response.raw().toString());//DONT WORK
Log.w("2.0 getFeed > retrofit => ", retrofit.toString());//DONT WORK
Log.w("2.0 getFeed > body => ", response.body().toString()); //DONT WORK
Log.w("2.0 getFeed > getStatus => ", response.body().getStatus());
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
Log.e("2.0 getFeed > onFailure => ", t.toString());
}
});
So drucken Sie die vollständige Antwort in json:
Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response));
Wenn Sie die Funktion pretty print haben möchten, verwenden Sie:
Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response));
Beachten Sie, dass auf diese Weise die deserialisierten Daten gedruckt werden (nicht die vom Server zurückgegebene Raw-Antwort). Um die rohe Antwort zu erhalten, können Sie eine der folgenden verwenden:
HttpLoggingInterceptor
siehe: https://stackoverflow.com/a/33256827/2267723 oder verwenden Sie eine eigene Version des InterceptorsStetho
. siehe: http://facebook.github.io/stetho/ oder Charles Web Debugging Proxy
. siehe: https://www.charlesproxy.comStecken Sie die folgende Interceptor-Klasse wie folgt ein
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new LoggingInterceptor());
////// Interceptor-Klasse
public static class LoggingInterceptor implements Interceptor {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Log.i("LoggingInterceptor","inside intercept callback");
Request request = chain.request();
long t1 = System.nanoTime();
String requestLog = String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers());
if(request.method().compareToIgnoreCase("post")==0){
requestLog ="\n"+requestLog+"\n"+bodyToString(request);
}
Log.d("TAG","request"+"\n"+requestLog);
com.squareup.okhttp.Response response = chain.proceed(request);
long t2 = System.nanoTime();
String responseLog = String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers());
String bodyString = response.body().string();
Log.d("TAG","response only"+"\n"+bodyString);
Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString);
return response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), bodyString))
.build();
}
public static String bodyToString(final Request request) {
try {
final Request copy = request.newBuilder().build();
final Buffer buffer = new Buffer();
copy.body().writeTo(buffer);
return buffer.readUtf8();
} catch (final IOException e) {
return "did not work";
}
}`
Eigentlich erzeugt Square bereits eine Klasse, nur dazu
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor).build();
Und in Retrofit
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("https://yourapi.com/api/")
.build();
Die Interceptor-Klasse befindet sich in Maven Central
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
Sie können den Protokolliergrad in der Klasse HttpLoggingInterceptor festlegen. KÖRPER ist das Verbose (es druckt alles auf den Körper). Weitere Informationen finden Sie auf OkHttp github
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.
Versuche dies !!
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
/** Handles Log */
retrofit.client().interceptors().add(new LoggingInterceptor());
mRestClient = retrofit.create(RestServices.class);
class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Logger.d(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Logger.d(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
final String responseString = new String(response.body().bytes());
Logger.d("Response: " + responseString);
return response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), responseString))
.build();
}
Um eine vollständige Antwort in Json in Retrofit2.3.0 zu erhalten, verwenden Sie unten.
das funktioniert für mich.
call.enqueue(new Callback<someList>() {
@Override
public void onResponse(Call<someList> call, Response<someList> response) {
if (response.isSuccessful())
Log.e("Success", new Gson().toJson(response.body()));
else
Log.e("unSuccess", new Gson().toJson(response.errorBody()));
}
@Override
public void onFailure(Call<someList> call, Throwable t) {
Log.e("onFailure", t.toString());
}
});
Sie können setLogLevel
wie unten beschrieben an Ihren Retrofit
Adapter anschließen und die Antwort und andere Daten wie Header, Antwortcode vs.
setLogLevel(LogLevel.FULL)
Wenn Sie Retrofit Version 2+ verwenden, müssen Sie OkHttpLoggingInterceptor
einstellen, um Protokolle anzuzeigen.
Fügen Sie Ihrem Projekt zuerst OkHttpLoggingInterceptor
hinzu:
com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptorVersion}
Und dann erstelle init deinen Abfangjäger:
HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }
Und schließlich fügen Sie es Ihrem OkHttpClient hinzu
with(OkHttpClient.Builder()) {
if (BuildConfig.DEBUG) addInterceptor(loggingInterceptor)
build()
}
Log.e("TAG","2.0 getFeed > response.raw() => " + new Gson().toJson(response.body()));
Versuche dies :
Log.d("LOG","RESPONSE ==="+response.raw().toString());
Werfen Sie einen Blick auf das Paket okhttp3.logging. Es gibt bereits einen HttpLoggingInterceptor, den Sie für Ihre Anforderungen verwenden können . Abhängig davon können Sie auch den Protokolliergrad angeben.
und Sie können diesen Interceptor wie erwähnt in Ihre Anfrage aufnehmen - über OkHttpClient.Builder:
public OkHttpClient provideOkHttpClient() {
final OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
return okHttpBuilder.build();
}
public class HttpLoggingInterceptor {
HttpLoggingInterceptor provideHttpLoggingInterceptor(){
return new HttpLoggingInterceptor(message ->
Log.d("TAG", message)).setLevel(HttpLoggingInterceptor.Level.BODY);
}
}
public class OkHttpClient {
OkHttpClient provideOkHttpClient(@NonNull HttpLoggingInterceptor interceptor){
return new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
}
}