XUtils3.0+ 关于网络请求使用的一些相关整理

来源:互联网 发布:内网访问阿里云 编辑:程序博客网 时间:2024/06/05 03:36


最近一段时间xutils已经升级到3.3.34了,由于android6.0移除掉了HttpClient的API,所以xutils在3.0+以上的版本改为对HttpUrlConnection进行封装,而android4.4之后HttpUrlConnection是基于最近比较流行的okhttp进行实现的。


       介绍完了一些相关的背景,现在就进入正题吧,这里只对xutils3.0+的网络请求做些简单的介绍,萌生这想法是由于xutils的作者提供的demo中一些网络请求,比如说下载就跟数据库混在一起,并没有单独拆开,因此在这里只讲解xutils在网络请求的使用。


需要的权限
<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上的地址


5 0