是否有一种方法可以从okhttp3的onfailure中获取原始的http post消息?

3
    Request request = new Request.Builder()
            .url("http://example.com")
            .post(RequestBody.create("foo",MediaType.get("text/plain")))
            .build();

client.newCall(request).enqueue(new Callback() {
             
                @Override
                public void onFailure(Call call, IOException e) {
                    //e.printStackTrace();
                    RequestBody b = call.request().body();
                    String t= b.toString(); ??? <-How would I get the original message?
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    //do something
                     
                }
            });

当出现错误时,我正在尝试保存我发送的原始消息。

我查阅了函数,并似乎无法弄清楚如何在回调中获取我发送的原始消息。是否有办法重新获取这条消息?

2个回答

2

如果有人正在寻找这个:

Buffer b = new Buffer();
call.request().body().writeTo(b)
String result=b.readString(Charset.defaultCharset()); //Change this to whatever your character set is

1
除了您的回答外,您还可以定义一个拦截器,并记录那些失败的请求。这是一个例子,没有任何条件:
class ReqInterceptor implements Interceptor 
{
   @Override
   public Response intercept(Interceptor.Chain chain) throws IOException
   {
     Request request = chain.request();  // original Request
     logger.info(String.format("Sending request %s on %s%n%s",
                 request.url(), chain.connection(), request.headers()));

     Response response = chain.proceed(request);
     logger.info(String.format("Received response for %s %s",
                 response.request().url(), response.headers()));
   
     return response;
   }
}

然后在客户端,类似这样:

OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(new ReqInterceptor()) //<--this
            .build();

Request request = new Request.Builder()
        .url("http://example.com")
        .post(RequestBody.create("foo",MediaType.get("text/plain")))
        .build();

Response response = client.newCall(request).execute();
response.body().close();

有两种类型,甚至有两个定义的实现用于Interceptor,但网络类型将提供与线传输的相同数据,因此如果需要精确信息,则可以选择此选项:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接