You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AsyncHttpClient的onFailure方法中获取已发送POST请求的请求体?

解决方案

方法一:将请求参数设为外部可访问变量

JsonHttpResponseHandler作为匿名内部类,可直接访问外部的final变量或类成员变量。你只需把构造好的请求参数声明为final,就能在onFailure方法里直接调用:

// 修正原代码错误,并将请求参数设为final
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.addHeader("secret", "123");

final JSONObject jsonParams = new JSONObject();
try {
    jsonParams.put("name", "Jon");
    StringEntity jsonEntity = new StringEntity(jsonParams.toString(), "UTF-8");
    jsonEntity.setContentType("application/json");
    
    asyncHttpClient.post(menu.this, "http://192.168.1.104:8000/", jsonEntity, "application/json", new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse ) {
            super.onFailure(statusCode, headers, throwable, errorResponse);
            // 直接获取请求体参数
            Log.d("RequestBody", "请求参数:" + jsonParams.toString());
        }
    });
} catch (JSONException | UnsupportedEncodingException e) {
    e.printStackTrace();
}

方法二:给请求绑定Tag存储请求体

如果需要批量管理请求或更灵活的参数存取,可以把请求体绑定到请求的tag上,在onFailure中取出:

AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.addHeader("secret", "123");

JSONObject jsonParams = new JSONObject();
try {
    jsonParams.put("name", "Jon");
    StringEntity jsonEntity = new StringEntity(jsonParams.toString(), "UTF-8");
    jsonEntity.setContentType("application/json");
    
    // 发起请求并获取请求句柄
    RequestHandle requestHandle = asyncHttpClient.post(menu.this, "http://192.168.1.104:8000/", jsonEntity, "application/json", new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse ) {
            super.onFailure(statusCode, headers, throwable, errorResponse);
            // 从请求Tag中取出存储的请求体
            if (throwable instanceof ConnectTimeoutException) {
                Request request = ((AsyncHttpRequest) ((FutureTask<?>) ((ConnectTimeoutException) throwable).getCause()).get()).getRequest();
                JSONObject savedParams = (JSONObject) request.getTag();
                Log.d("RequestBody", "请求参数:" + savedParams.toString());
            }
        }
    });
    // 将请求参数存入请求Tag
    requestHandle.getRequest().setTag(jsonParams);
} catch (JSONException | UnsupportedEncodingException e) {
    e.printStackTrace();
}

注意事项

  • 原代码存在两处错误:onParams.put应为jsonParams.put;jsonEntity需通过jsonParams生成,上述代码已修正这些问题。
  • 方法一简单直接,适合多数场景;方法二更适合需要统一管理请求的复杂场景。

内容的提问来源于stack exchange,提问作者Алексей Скоробогатов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:27:53