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

Android Xutils框架使用问题及解决办法的更多相关文章

  1. Android Xutils 框架(转)

    Android Xutils 框架 (转) 目录(?)[-] xUtils简介 目前xUtils主要有四大模块 使用xUtils快速开发框架需要有以下权限 混淆时注意事项 DbUtils使用方法 Vi ...

  2. 配置Android环境遇到的问题及解决办法

    配置Android环境遇到的问题及解决办法: 1 环境安装地址 http://pan.baidu.com/s/1jGzNzyI 2 其他: 2.1 安装 2.1.1 安装JDK,JRE 成功安装之后, ...

  3. vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法

    vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法 在vue 里面<style scoped></style> 是为了让样式只影响本身自己组件的样式,不改变全 ...

  4. import android.support.v4或者import android.support.v7提示导入错误解决办法

    转自:  http://blog.csdn.net/forandever/article/details/37655139 在使用Eclipse开发andriod程序时,程序中提示import and ...

  5. Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法

    问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...

  6. Android Studio生成javadoc出错的解决办法

    一般使用Android Studio生成javadoc会有两个问题: 空指针异常 文档乱码 解决办法如下: 第1个问题:Tools --> Generate JavaDoc -->打开对话 ...

  7. Android开发遇到的异常及解决办法

    Android开发遇到的错误及解决方法1. Unable to resolve target 'android-7' 解决方案: 修改工程目录下的default.properties文件里的内容tar ...

  8. Android SDK Manager无法更新的解决办法

    Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xmlFailed to fetch URL https://d ...

  9. Android 开发遇到的问题及解决办法

    Failed to resolve: com.android.support:appcompat-v7:23.4.0 问题解决办法: 1.在Android SDK Manager中找到对应的SDK版本 ...

随机推荐

  1. 2019.9.28 csp-s模拟测试54 反思总结

    咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… ...

  2. golang之if

    1.if语句 (1)if (2)if else (3)if esle ...else

  3. list的基本使用

    转自:https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/10/2631191.html vector :vector和built-in数组类似 ...

  4. 7. 18 test 砍树题解

    (题面保密,内部人员可览) 首先观察题面,可得出如下公式 ∑(ceil(a[i] /d)*d−a[i])≤k 其中,ceil(a[i] /d)表示在需要被砍伐之前所经过的轮数,ceil函数是为了保证一 ...

  5. DFA算法实现敏感词过滤

    DFA算法:即确定有穷自动机,简单点说就是,它是是通过event和当前的state得到下一个state,即event+state=nextstate.理解为系统中有多个节点,通过传递进入的event, ...

  6. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  7. vue组件通信全面总结

    写在前面 组件间的通信是是实际开发中非常常用的一环,如何使用对项目整体设计.开发.规范都有很实际的的作用,我在项目开发中对此深有体会,总结下vue组件间通信的几种方式,讨论下各自的使用场景 文章对相关 ...

  8. KiCad 元件值 F4NNIU 规范(2019-10-10)

    目录 KiCad 元件值 F4NNIU 规范 电阻 电容 电感 二极管 三极管 MOSFET IC 文件历史 KiCad 元件值 F4NNIU 规范 为方便物料统计以及规范物料,在制造 BOM 时可以 ...

  9. 记一次goland的包导入问题

    昨天把go的GOPATH环境变量设置成了“/home/mi/app/gopath”,今天用goland新建的项目在/home/mi/go/src目录下,名字是studygolang,如下图. 结果导入 ...

  10. 微服务开源生态报告 No.6

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...