刚刚写了篇博客,提了下在使用XUtils时遇到的一个问题Android Xutils框架HttpUtil Get请求缓存问题 ,既然已经提起来这个问题,那我想了下,就把之前使用Xutils时遇到的几个小问题整理一下。
关于Xtuls框架的Http模块的get请求方法,会有缓存问题——即进行get请求时,在缓存规定的时间内,如果发送同样的请求url,则不会再次请服务器发送请求,而是直接返回上次请求的结果。 之前写了一篇博客已经介绍的很详细了,可查看《Android Xutils框架HttpUtil Get请求缓存问题》。
二、 如何直接在HTTP请求时发送一个字符串
首先,我想先说下,如何使用Xutils的框架HTTP模块向服务器发送数据,这里必须介绍一个API:com.lidroid.xutils.http.RequestParams,我不贴出该类的源码了,且把方法给大家看下:
从以上方法可以看出,它提供的几个方法非常方便,不仅可以直接使用addQueryStringParameter(String name, String value)方法,将参数以key-value的形式放入其中,(一般用于get请求),还有addBodyParameter(String name, String value) ,讲参数放在Http的body中;还有addHeader(String name, String value)等方法,允许添加HTTP请求的Header,可谓是方便之极。
下面有人会问了,如果我不以key-value的形式上传参数,而是想直接把一串字符(JSON串,普通字符串等)传到服务器中,那该怎么办呢?
有办法!
1. 对于Get请求,如果要直接上传一串字符,可以直接把它连接在url上。
比如我要请求的地址是: http://www.imooc.com/api/teacher,需要上传的参数是“{"id": 1,"learner": 12312}”,那我可以直接把他拼接在url上,变成" http://www.imooc.com/api/teacher?{"id": 1,"learner": 12312}"
服务器按照约定,再进行相应的处理就好了。当然对于上述的请求,字符串中有特殊字符,我们要求对其进行URL编码: URLEncoder.encode(),之后才可以上传。
2. 对于Post请求,使用requestParams.setBodyEntity(HttpEntity bodyEntity)
如果我们上传的是字符串,使用HttpEntity的子类实例StringEntity即可: requestParams.setBodyEntity(new StringEntity(""))。
三、 java.net.URISyntaxException的解决办法
前些天做项目,使用Xutils Http get请求时,当我发送的一串字符串中含有特殊字符,就会发生这种情况。查找了一些网上资料,说地址中涉及了特殊字符,如‘|’‘&’等。所以不能直接用String代替URI来访问。必须采用%0xXX方式来替代特殊字符。但这种办法不直观。所以只能先把String转成URL,再能过URL生成URI的方法来解决问题。代码如下:
URL url = new URL(strUrl); URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null); HttpClient client = new DefaultHttpClient(); HttpGet httpget = new HttpGet(uri);
看懂了这里,所以我们看下Xutils源码的URIBuilder.java源文件,发现它的构造方法是直接把传入的url构造成了uri:
public URIBuilder(final String uri) { try { digestURI(new URI(uri)); } catch (URISyntaxException e) { LogUtils.e(e.getMessage(), e); } }简要修改下源码:
public URIBuilder(String uri) { try { URL e = new URL(uri); this.digestURI(new URI(e.getProtocol(), e.getHost(), e.getPath(), e.getQuery(), (String)null)); } catch (Exception var3) { LogUtils.e(var3.getMessage(), var3); } }这就好了,重新编译xutil.jar文件,可以放心使用了。
当然了,之前说了,对于get请求的特殊字符,我们可以采用URLEncoder.encode()进行特殊字符的编码来解决。 可是,我试了下,用这个方法并没能解决我的问题,所以我才采取了修改源码的方法。有兴趣的同学可以再次尝试下。
后记:
推荐几篇比较好的关于Xutils框架的文章,挺全面的:
1. http://www.tuicool.com/articles/nMFb2q Android开源项目xUtils HttpUtils模块分析
2. https://github.com/wyouflf/xUtils XUtils github地址
3. http://blog.csdn.net/zuiwuyuan/article/category/2217073 Xutils框架基本使用介绍