XUtils3.0+ 关于网络请求使用的一些相关整理
来源:互联网 发布:内网访问阿里云 编辑:程序博客网 时间:2024/06/05 03:36
最近一段时间xutils已经升级到3.3.34了,由于android6.0移除掉了HttpClient的API,所以xutils在3.0+以上的版本改为对HttpUrlConnection进行封装,而android4.4之后HttpUrlConnection是基于最近比较流行的okhttp进行实现的。
需要的权限
<uses-permissionandroid:name="android.permission.INTERNET" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
初始化
// 在application的onCreate中初始化
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
...
}
简单的版本
1.Get请求
RequestParams params = new RequestParams("https://www.baidu.com/");// 网址(请替换成实际的网址) params.addQueryStringParameter("key", "value");// 参数(请替换成实际的参数与值) x.http().get(params, new CommonCallback<String>() {@Overridepublic void onCancelled(CancelledException arg0) {}// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看@Overridepublic void onError(Throwable ex, boolean isOnCallback) { Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); if (ex instanceof HttpException) { // 网络错误 HttpException httpEx = (HttpException) ex; int responseCode = httpEx.getCode(); String responseMsg = httpEx.getMessage(); String errorResult = httpEx.getResult(); // ... } else { // 其他错误 // ... }}// 不管成功或者失败最后都会回调该接口@Overridepublic void onFinished() {}@Overridepublic void onSuccess(String arg0) {}});
2.Post请求
RequestParams params = new RequestParams("https://www.baidu.com/");// 网址(请替换成实际的网址) params.addBodyParameter("key", "value");// 参数(请替换成实际的参数与值) x.http().post(params, new CommonCallback<String>() {@Overridepublic void onCancelled(CancelledException arg0) {}// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看@Overridepublic void onError(Throwable ex, boolean isOnCallback) { Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); if (ex instanceof HttpException) { // 网络错误 HttpException httpEx = (HttpException) ex; int responseCode = httpEx.getCode(); String responseMsg = httpEx.getMessage(); String errorResult = httpEx.getResult(); // ... } else { // 其他错误 // ... }}// 不管成功或者失败最后都会回调该接口@Overridepublic void onFinished() {}@Overridepublic void onSuccess(String arg0) {}});
get的post的请求基本一致,也就添加参数的方法不同而已。调用get方法,添加参数是用addQueryStringParameter。调用post方法,添加参数是用addBodyParameter。
3.传json字符串
RequestParams params = new RequestParams(Constant.POST_WRITE_TEST_REPORT);params.setAsJsonContent(true);// 设置要传给后台的json字符串params.setBodyContent(paramJsonObject.toString());x.http().post(params, new CommonCallback<String>() {……});
除了设置json字符串所调动的方法不同外,该怎么调用还是怎么调用,就是如此简单。
4.获取Cookies,并且带给后台
xutils3.0+默认在访问时会将cookies和sessionId保存下来,并在下次访问时一并传给后台,但若是用户把程序退出后,重新进行访问就会保存最新的cookies与sessionId,会导致sessionid有可能导致不一致的情况,这种情况下我们可以自己保存下cookies与sessionId并在每次请求后台接口时传递过去。
比如在登陆成功后保存下cookies与session
x.http().post(params, new CommonCallback<String>() {……@Overridepublic void onSuccess(String arg0) {// 保存cookie的值DbCookieStore instance = DbCookieStore.INSTANCE;List<HttpCookie> cookies = instance.getCookies();for (int i = 0; i < cookies.size(); i++) {HttpCookie cookie = cookies.get(i);if (cookie.getName() != null&& cookie.getName().equals(Constant.COOKIE_NAME)) {SPUtil.putString(mContext.getApplicationContext(),Constant.COOKIE_NAME, cookie.getValue());}if (cookie.getName() != null && cookie.getName().equals(Constant.COOKIE_SESSION)) {SPUtil.putString(mContext.getApplicationContext(),Constant.COOKIE_SESSION, cookie.getValue());}LogUtils.sysout(TAG + ": cookie name --> " + cookie.getName());LogUtils.sysout(TAG + ": cookie value --> " + cookie.getValue());}}});
在使用时把cookies与session传给后台
StringBuilder sbCookie = new StringBuilder();sbCookie.append(Constant.COOKIE_NAME).append("=").append(SPUtil.getString(context.getApplicationContext(),Constant.COOKIE_NAME)).append("; path=/; domain=").append(Constant.DOMAIN);params.addHeader("Cookie", sbCookie.toString());StringBuilder sbSession = new StringBuilder();sbSession.append(Constant.COOKIE_SESSION).append("=").append(SPUtil.getString(context.getApplicationContext(),Constant.COOKIE_SESSION)).append("; path=/; domain=").append(Constant.DOMAIN);params.addHeader("Cookie", sbSession.toString());x.http().post(params, new CommonCallback<String>() {……});
好了,就是这么简单,调用addHeader,往Cookie添加进去即可。虽然addHeader的是同一个key值Cookie,但会追加上去而不是覆盖,所以不用担心。
5.上传文件
RequestParams params = new RequestParams(Constant.UPLOAD_TEST_REPORT_PIC);// 上传文件的接口params.setMultipart(true);params.addBodyParameter("file", uploadFile);x.http().post(params, new CommonCallback<String>() {……});
6.下载文件
RequestParams params = new RequestParams(url);// 文件在服务器上的存放路径params.setAutoResume(true);// 是否使用断点下载params.setAutoRename(false);// 下载后是否根据文件的属性自动命名params.setSaveFilePath(downPath.toString());// 文件的本地保存路径//params.setExecutor(executor);// 可以通过该方法设置下载的线程数// 为请求创建新的线程, 取消时请求线程被立即中断; false: 请求建立过程可能不被立即终止params.setCancelFast(true);x.http().get(params, new DownloadCallback(){ @Override public void onStarted() { super.onStarted(); } @Override public void onSuccess(File result) { super.onSuccess(result); } @Override public void onError(Throwable ex, boolean isOnCallback) { super.onError(ex, isOnCallback); } @Override public void onLoading(long total, long current, boolean isDownloading) { super.onLoading(total, current, isDownloading); } });最后贴上xutils3.0+在github上的地址
- XUtils3.0+ 关于网络请求使用的一些相关整理
- Xutils3网络请求的封装
- Xutils3网络请求的封装
- xUtils3.0版本的发送同步网络请求的方式
- Android XUtils3.0 Http网络请求的介绍
- Xutils3.0请求网络数据工具类
- 关于xutils3.0框架的封装以及抽取,方便使用
- android Xutils3网络请求封装
- 关于TTSERVER的一些网络资料整理
- xUtils3.0使用介绍:网络模块
- 关于Xutils3的使用那些事儿
- XUtils3.0的简单使用
- xutils3.0 post请求网络,后台无法接收到参数
- XUtils3.0数据库的一些操作
- Xutils3.0网络带缓存的封装
- 从网上整理了一些关于比较时间大小和请求网络时间的代码,在这里展示一下
- 关于Txeview使用的一些整理
- xutils3.0网络请求的关键代码 (这么挨着写是为了区分和2.0之间的区别)
- IOS数据存储
- 剑指offer 面试题
- C语言打印9*9乘法口诀表
- 音频播放(只是一些总结没有代码)
- leetcode-62. Unique Paths
- XUtils3.0+ 关于网络请求使用的一些相关整理
- [编译原理]学习笔记(一)——编译概述
- 平衡搜索树-AVL树
- 【总结】利用AWS实现高可用性和云灾备
- Cocos2dx - Scheduler学习理解
- RunLoop
- C++ 重载解析 知多少?
- hql多表关联查询
- android studio将代码关联到git@osc(出现 Empty repository,以及push reject解决)