如何在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,提问作者Алексей Скоробогатов
相关产品推荐
相关产品推荐

