Estou tentando obter o JSON exato que está sendo enviado na solicitação. Aqui está o meu código:
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
@Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
request.body().toString(), request.headers()));
com.squareup.okhttp.Response response = chain.proceed(request);
return response;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client).build();
Mas só vejo isso nos logs:
request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json
Como devo fazer o registro adequado, dada a remoção setLog()
e setLogLevel()
que costumávamos usar com o Retrofit 1?
Eu conheci o que você e eu tentei perguntar ao autor do livro Retrofit: Adoro trabalhar com APIs no Android (aqui está o link ) (não! Eu não estou fazendo alguns anúncios para eles .... mas eles são muito legais pessoal :) E o autor me respondeu muito em breve, com o método Log no Retrofit 1.9 e no Retrofit 2.0-beta.
E aqui está o código do Retrofit 2.0-beta:
É assim que se adiciona o método de log com a ajuda do HttpLoggingInterceptor . Além disso, se você é o leitor do livro que mencionei acima, pode achar que ele diz que não existe mais o método log com o Retrofit 2.0 - o qual, perguntei ao autor, não está correto e eles atualizarão o livro no próximo ano falando sobre isso.
// Caso você não esteja familiarizado com o método Log no Retrofit, gostaria de compartilhar algo mais.
Também deve ser observado que existem alguns níveis de log que você pode escolher. Eu uso o Level.BODY na maioria das vezes, o que dará algo assim:
Você pode encontrar quase toda a equipe http na imagem: o cabeçalho, o conteúdo e a resposta etc.
E, às vezes, você realmente não precisa de todos os convidados para comparecer à sua festa: eu só quero saber se a conexão foi bem-sucedida, que a chamada pela Internet foi feita com sucesso dentro da minha Activiy & Fragmetn. Então você está livre para usar o Level.BASIC , que retornará algo como isto:
Você pode encontrar o código de status 200 OK por dentro? É isso :)
Também há outro, Level.HEADERS , que retornará apenas o cabeçalho da rede. Ya, claro, outra foto aqui:
Esse é todo o truque do registro;)
E gostaria de compartilhar você com o tutorial que aprendi muito por lá . Eles têm um ótimo post falando sobre quase tudo relacionado ao Retrofit e continuam atualizando o post, ao mesmo tempo em que o Retrofit 2.0 está chegando. Por favor, dê uma olhada nesses trabalhos, o que acho que economizará muito tempo.
fonte
Aqui está um
Interceptor
que registra os corpos de solicitação e resposta (usando o Timber, com base em um exemplo dos documentos do OkHttp e em algumas outras respostas do SO):fonte
Tente o seguinte:
Depois disso, no
body
JSON você está interessado.fonte
String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build();
(Você não pode ler o corpo de resposta mais de uma vez, então você vai ter que criar uma nova resposta com o construtor)O principal problema que enfrentei foi adicionar dinamicamente cabeçalhos e registrá-los no logcat de depuração. Eu tentei adicionar dois interceptores. Um para registro e outro para adicionar cabeçalhos em movimento (autorização de token). O problema era que poderíamos .addInterceptor ou .addNetworkInterceptor. Como Jake Wharton me disse: "Os interceptores de rede sempre vêm depois dos interceptadores de aplicativos. Consulte https://github.com/square/okhttp/wiki/Interceptors ". Então, aqui está um exemplo de trabalho com cabeçalhos e logs:
fonte
Não sei se setLogLevel () retornará na versão final 2.0 do Retrofit, mas por enquanto você pode usar um interceptador para o log.
Um bom exemplo pode ser encontrado no wiki do OkHttp: https://github.com/square/okhttp/wiki/Interceptors
fonte
Se você estiver usando Retrofit2 e okhttp3, precisará saber que o Interceptor funciona por fila. Portanto, adicione loggingInterceptor no final, após seus outros interceptadores:
fonte
Para aqueles que precisam de registro de alto nível no Retrofit, use o interceptador como este
Cortesia : https://github.com/square/retrofit/issues/1072#
fonte
Código Kotlin
fonte
Você também pode adicionar o Stetho do Facebook e ver os rastreamentos de rede no Chrome: http://facebook.github.io/stetho/
Em seguida, abra "chrome: // inspecionar" no Chrome ...
fonte
isso criará um objeto de atualização com o log. sem criar objetos separados.
fonte
Primeiro adicione dependência ao build.gradle:
implementação 'com.squareup.okhttp3: logging-interceptor: 3.12.1'
Enquanto estiver usando o Kotlin, você pode adicionar o Logging Interceptor assim:
fonte
O seguinte conjunto de códigos está funcionando sem problemas para mim
Gradle
RetrofitClient
Também é possível verificar os resultados acessando a guia Profiler na parte inferior do Android Studio, clicando em + sinal para Iniciar uma nova sessão e selecione o pico desejado em "Rede". Lá você pode obter tudo, mas é complicado e lento. Por favor, veja a imagem abaixo.
fonte
A melhor maneira de fazer isso corretamente no Retrofit 2 é adicionar o interceptor do criador de logs como um networkInterceptor, que também imprimirá os cabeçalhos da rede e os cabeçalhos personalizados. O importante é lembrar que o interceptador funciona como uma pilha e certifique-se de adicionar o logger no final de tudo.
fonte
A maioria das respostas aqui abrange quase tudo, exceto esta ferramenta, uma das maneiras mais legais de ver o log.
É o Stetho do Facebook . Essa é a excelente ferramenta para monitorar / registrar o tráfego de rede do seu aplicativo no google chrome . Você também pode encontrar aqui no Github.
fonte
para o Retrofit 2.0.2, o código é como
fonte
Aqui está uma maneira simples de filtrar qualquer parâmetro de solicitação / resposta dos logs usando
HttpLoggingInterceptor
:Aqui está a essência completa:
https://gist.github.com/mankum93/179c2d5378f27e95742c3f2434de7168
fonte
Eu também estava preso em um tipo semelhante de situação, o
setLevel()
método não estava chegando, quando eu estava tentando chamá-lo com a instância do HttpLoggingInterceptor, assim:Aqui está como eu resolvi isso, para gerar log para o Retrofit2,
Suponho que você adicionou a dependência,
Para a versão mais recente, você pode conferir este link:
https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor )
Aqui eles também explicaram sobre como adicionar.
Eu criei uma classe com o nome
AddLoggingInterceptor
, aqui está o meu código,Então, onde estamos instanciando nosso Retrofit,
Agora você pode ver o log gerado no seu Android Studio, pode ser necessário pesquisar o
okHttp
processo de filtragem. Funcionou para mim. Se houver algum problema, você pode me enviar uma mensagem aqui.fonte
Encontrei caminho para o Print Log in Retrofit
Funciona para mim.
fonte
O interceptador do Retrofit é um ótimo recurso que permite trabalhar com solicitações http. Existem dois tipos deles: aplicativo e interceptores de rede.
Eu recomendaria usar
Charles Web Debugging Proxy Application
se você precisar registrar suas solicitações / respostas. A saída é muito semelhante ao Stetho, mas é um instrumento mais poderoso que você não precisa adicionar como dependência a um aplicativofonte
ei pessoal, eu já acho solução:
fonte