最近一段时间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() {
@Override
public void onCancelled(CancelledException arg0) {
}
// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误
// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看
@Override
public 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 { // 其他错误
// ...
}
}
// 不管成功或者失败最后都会回调该接口
@Override
public void onFinished() {
}
@Override
public void onSuccess(String arg0) {
}
});
2.Post请求
RequestParams params = new RequestParams("https://www.baidu.com/"); // 网址(请替换成实际的网址)
params.addBodyParameter("key", "value"); // 参数(请替换成实际的参数与值)
x.http().post(params, new CommonCallback() {
@Override
public void onCancelled(CancelledException arg0) {
}
// 注意:如果是自己onSuccess回调方法里写了一些导致程序崩溃的代码,也会回调道该方法,因此可以用以下方法区分是网络错误还是其他错误
// 还有一点,网络超时也会也报成其他错误,还需具体打印出错误内容比较容易跟踪查看
@Override
public 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 { // 其他错误
// ...
}
}
// 不管成功或者失败最后都会回调该接口
@Override
public void onFinished() {
}
@Override
public 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() {
……
});
除了设置json字符串所调动的方法不同外,该怎么调用还是怎么调用,就是如此简单。
4.获取Cookies,并且带给后台
xutils3.0+默认在访问时会将cookies和sessionId保存下来,并在下次访问时一并传给后台,但若是用户把程序退出后,重新进行访问就会保存最新的cookies与sessionId,会导致sessionid有可能导致不一致的情况,这种情况下我们可以自己保存下cookies与sessionId并在每次请求后台接口时传递过去。
比如在登陆成功后保存下cookies与session
x.http().post(params, new CommonCallback() {
……
@Override
public void onSuccess(String arg0) {
// 保存cookie的值
DbCookieStore instance = DbCookieStore.INSTANCE;
List 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() {
……
});
好了,就是这么简单,调用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() {
……
});
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上的 地址