zoukankan      html  css  js  c++  java
  • Android Xutils框架使用问题及解决办法

        刚刚写了篇博客,提了下在使用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框架基本使用介绍

  • 相关阅读:
    Shodan新手入坑指南
    linux 下查看网卡工作速率
    centos关闭ipv6
    springBoot----@ConditionalOnxxx相关注解总结
    ElasticSearch Root身份运行
    CentOS6 Install kafka
    CentOS 7 中firewall-cmd命令
    sensu
    metrics+spring+influxdb
    SpringBoot(十二):SpringBoot整合Kafka
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329976.html
Copyright © 2011-2022 走看看