网络通信系列文章序
彻底掌握网络通信(一)Http协议基础知识
彻底掌握网络通信(二)Apache的HttpClient基础知识
彻底掌握网络通信(三)Android源码中HttpClient的在不同版本的使用
彻底掌握网络通信(四)Android源码中HttpClient的发送框架解析
彻底掌握网络通信(五)DefaultRequestDirector解析
彻底掌握网络通信(六)HttpRequestRetryHandler解析
彻底掌握网络通信(七)ConnectionReuseStrategy,ConnectionKeepAliveStrategy解析
彻底掌握网络通信(八)AsyncHttpClient源码解读
彻底掌握网络通信(九)AsyncHttpClient为什么无法用Fiddler来抓包
彻底掌握网络通信(十)AsyncHttpClient如何发送JSON解析JSON,以及一些其他用法
AsyncHttpClient的常用方法可以做到entity的添加,header的添加,json的解析,这里简单介绍下AsyncHttpClient的其他方法
1.1: 发送带Entity的http请求
private void sendPostWithEntity(){
AsyncHttpClient client = new AsyncHttpClient();
client.setProxy("172.29.14.249",8888);
String postBody = "this is post body";
ByteArrayEntity entity = null;
try {
entity = new ByteArrayEntity(postBody.getBytes("UTF-8"));
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
client.post(this,"http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin",entity,"application/json",new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
}
@Override
public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
}
});
}
第4行,我们在发送httppost请求的时候,添加了一个“this is post body”的entity,我们抓下包看下,entity是否添加了
如图所示,entity已经正确添加
1.2: 发送一个添加header的http请求
private void sendPostWithHeader(){
AsyncHttpClient client = new AsyncHttpClient();
client.setProxy("172.29.14.249",8888);
client.addHeader("name","hwj");
client.post("http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
}
@Override
public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
}
});
}
抓包显示如下
1.3:如何发送JSON的消息体
将json放到消息体中,我们可以采用StringEntity的方式按照1.1的代码进行,也可以按照如下方法
private void sendPostWithJson(){
RequestParams params = new RequestParams();
params.setUseJsonStreamer(true);
JSONObject body;
if ((body = getBodyTextAsJSON()) != null) {
try {
Iterator keys = body.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
Log.d("hwj", " " + key + ": " + body.get(key));
params.put(key, body.get(key).toString());
}
} catch (JSONException e) {
Log.w("hwj", "Unable to retrieve a JSON value", e);
}
}
AsyncHttpClient client = new AsyncHttpClient();
client.setProxy("172.29.14.249",8888);
client.post(this, "http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin", null, params,
RequestParams.APPLICATION_JSON,new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
}
@Override
public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
}
});
}
protected JSONObject getBodyTextAsJSON() {
String bodyText = "{\n" +
"\"employees\": [\n" +
"{ \"firstName\":\"Bill\" , \"lastName\":\"Gates\" },\n" +
"{ \"firstName\":\"George\" , \"lastName\":\"Bush\" },\n" +
"{ \"firstName\":\"Thomas\" , \"lastName\":\"Carter\" }\n" +
"]\n" +
"}";
if (bodyText != null && !TextUtils.isEmpty(bodyText)) {
try {
return new JSONObject(bodyText);
} catch (JSONException e) {
Log.e("hwj", "User's data is not a valid JSON object", e);
}
}
return null;
}
其实代码很简单,参考第19行,其实就是调用重载的post方法, 将params放到entity里面罢了
更多的sample这边就不一一列举了,可以参考如下地址
asynchttpclient样例