刚刚写了篇博客,提了下在使用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. mysql8忘记密码的解决方法

    mysql8忘记密码的解决方法 1.管理员身份打开cmd,进入dos 2.停止mysql服务 命令:net stop mysql 3.无密码启动 命令:mysqld --console --skip- ...

  2. 2018-8-10-如何移动-nuget-缓存文件夹

    title author date CreateTime categories 如何移动 nuget 缓存文件夹 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...

  3. wordpress主题之后台菜单编辑,小工具

    1一:菜单编辑 在functions.php 文件加入 if (function_exists('register_nav_menus')) { register_nav_menus(array( / ...

  4. Redis 复制、Sentinel的搭建和原理说明(转)

    Redis 复制.Sentinel的搭建和原理说明  转自:http://www.cnblogs.com/zhoujinyi/p/5570024.html. 背景: Redis-Sentinel是Re ...

  5. 模拟4题解 T3奇袭

    T3奇袭 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本 ...

  6. !important覆写css行内样式

    <div class="block"> <span style="font-weight: bold; color: red;">Hel ...

  7. 50倍时空算力提升,阿里云RDS PostgreSQL GPU版本上线

    2019年3月19日,阿里云RDS PostgreSQL数据库GPU规格版本正式上线,开启了RDS异构计算并行加速之路.该版本在RDS(关系型数据库服务)的云基础设施层面首次完成了与阿里云异构计算产品 ...

  8. 工程没有生成lib文件,只生成了dll文件

    解决办法: 在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加 重新编译编译就可生成.li ...

  9. PHP核心编程--站内搜索

    一.         站内搜索 前台页面: 在index.php页面中添加一个表单,输入搜索框 后台页面: 将index.php另存为search.php 对于搜索的 分页关键代码: 高亮关键字 相关 ...

  10. img标签src不给路径就会出现边框

    <img/>在src加载失败或没有给的,浏览器会自动给img加上边框. 如下图这样: 产品觉得影响美观,一定要pass掉. 原码是这样: .ctn{ position: relative; ...