Android Xutils框架使用问题及解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zuiwuyuan/article/details/48110997

    刚刚写了篇博客,提了下在使用XUtils时遇到的一个问题Android Xutils框架HttpUtil Get请求缓存问题 ,既然已经提起来这个问题,那我想了下,就把之前使用Xutils时遇到的几个小问题整理一下。


一、 HttpUtil Get请求缓存问题

      关于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框架基本使用介绍

展开阅读全文

没有更多推荐了,返回首页