最近做的一个android的小应用里面用到了Android Asynchronous Http Client(Android Asynchronous Http Client)来向服务器端发请求,下面是自己的一些体会
1. 提供了多个不同参数的接口可以发送GET, PUT, DELETE, POST的异步网络请求,通过AsyncHttpResponseHandler 来处理网络请求返回后的结果。从GitHub上clone了源代码看了看,其实他是用apache http 的类去发送request和获取response,拿到response后,通过一个Handler来sendMessage,完成各种回调,所以在android开发的时候,可以在UI线程里面直接去初始化AsyncHttpClient然后去post请求,不会抛出在UI thread 请求http service的异常。
2. 接口支持的参数很多种,可以方便的添加http header,可以直接传入HttpEntity,可以传入他自己定义的RequestParam来上传file,或是加入一个inputstream等等,可以很方便的指定Content-Type等等。
在使用的过程中也发现了几个问题
1.上传文件不成功
根据doc,上传文件只用
RequestParams requestParams = new RequestParams();
File file = new File(fileSrcPath);
requestParams.put(upload_load_file_name, file);
然后call client的post方法就可以上传。
但是用apache common upload实现的服务器总是报这样一个异常
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
后来用抓包工具看了看send出去的请求发现,Content-Type只是multipart/form-data,没有上传文件的boundary在里面。正确的content-type应该是
multipart/form-data; boundary=**********
boundary 的值和附件中的boundary一样
查看了asyncHttpClient的源代码,在SimpleMultipartEntity的method
public Header getContentType()
中直接返回了Header
return new BasicHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
这正是我们想要的。奇怪的是发出的request里面Content-Type不对。
2. 中文乱码
从UI中获取的中文的输入,然后拼成了JSONObject。最开始我是这样发送的
StringEntity entity = new StringEntity(json.toString());
client.post(context, url, entity, "application/json", responseHandler);
可以服务器收到的是乱码。后来改成这种方式,就ok了
byte[] bytes = json.toString().getBytes("utf-8");
ByteArrayEntity entity = new ByteArrayEntity(bytes);
client.post(context, url, entity, "application/json", responseHandler);
调试的时候可以看到json.toString()中的中文都是正确的,可是用StringEntity发出后就不对了,究其原因,我猜测是StringEntity的底层实现,实际上是调用了string.getBytes(),但是没有指定charset,就使用了默认的charset,比如iso8859-1什么之类的,这样就产生乱码了。这是只是猜测,没有经过证实。
1. 提供了多个不同参数的接口可以发送GET, PUT, DELETE, POST的异步网络请求,通过AsyncHttpResponseHandler 来处理网络请求返回后的结果。从GitHub上clone了源代码看了看,其实他是用apache http 的类去发送request和获取response,拿到response后,通过一个Handler来sendMessage,完成各种回调,所以在android开发的时候,可以在UI线程里面直接去初始化AsyncHttpClient然后去post请求,不会抛出在UI thread 请求http service的异常。
2. 接口支持的参数很多种,可以方便的添加http header,可以直接传入HttpEntity,可以传入他自己定义的RequestParam来上传file,或是加入一个inputstream等等,可以很方便的指定Content-Type等等。
在使用的过程中也发现了几个问题
1.上传文件不成功
根据doc,上传文件只用
RequestParams requestParams = new RequestParams();
File file = new File(fileSrcPath);
requestParams.put(upload_load_file_name, file);
然后call client的post方法就可以上传。
但是用apache common upload实现的服务器总是报这样一个异常
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
后来用抓包工具看了看send出去的请求发现,Content-Type只是multipart/form-data,没有上传文件的boundary在里面。正确的content-type应该是
multipart/form-data; boundary=**********
boundary 的值和附件中的boundary一样
查看了asyncHttpClient的源代码,在SimpleMultipartEntity的method
public Header getContentType()
中直接返回了Header
return new BasicHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
这正是我们想要的。奇怪的是发出的request里面Content-Type不对。
2. 中文乱码
从UI中获取的中文的输入,然后拼成了JSONObject。最开始我是这样发送的
StringEntity entity = new StringEntity(json.toString());
client.post(context, url, entity, "application/json", responseHandler);
可以服务器收到的是乱码。后来改成这种方式,就ok了
byte[] bytes = json.toString().getBytes("utf-8");
ByteArrayEntity entity = new ByteArrayEntity(bytes);
client.post(context, url, entity, "application/json", responseHandler);
调试的时候可以看到json.toString()中的中文都是正确的,可是用StringEntity发出后就不对了,究其原因,我猜测是StringEntity的底层实现,实际上是调用了string.getBytes(),但是没有指定charset,就使用了默认的charset,比如iso8859-1什么之类的,这样就产生乱码了。这是只是猜测,没有经过证实。