创建OkHttpClient mOkHttpClient=new OkHttpClient.Builder(); 设置网络配置,SSl认证(TrustManager[])等
一.get请求:
①同步:
String url = getUrlAddParams(trueUrl,Map param);//get请求的参数要自己组装在url里;
Request request = new Request.Builder().url(url).build();
//new Request.Builder(),默认method为get;
也可以链式调用 new Request.Builder().url(url).get().build()
执行:
Call call = mOkHttpClient.newCall(request);
Response response = call.execute();
if(response.isSuccessful()) {
result = response.body().string();
}else{
throw new IOException("Unexpected code "+ response);
}
请求是在子线程中执行的,可使用handler回调到UI界面再更新UI
//get请求参数组装
private String getUrlAddParams(String url, Map param) {
String urls = url;
Map
if(map ==null) {
return urls ;
}
Set
for(String key : ks) {
String value = (String) map.get(key);
urls = appendParams(urls, key +"="+ value);
}
return urls;
}
/**
* 给url添加参数
*/
private String appendParams(String url, String params) {
if (TextUtils.isEmpty(url) || TextUtils.isEmpty(params)) {
return url;
}
if (url.contains("?")) {
// url中已经有参数
return url +"&" + params;
}else {
// url中没有参数
return url +"?" + params;
}
}
②异步:
区别在于不直接execute,而是添加到队列,进行回调,ResponseCallBack继承Callback
mOkHttpClient.newCall(request).enqueue(new ResponseCallBack(callback));
注意:真正请求时,要在自定义UI层的回调接口CustomCallback传入,ResponseCallBack第一层回调时,调用CustomCallback的各接口方法
可参考自己的项目或者https://blog.csdn.net/u013210620/article/details/52397690
二.post请求:
①同步:
//下面以FormBody为例,postBody一般分两种:FormBody、
另一种为MediaType是Json格式的自定义Body;
String mediaType= MediaType.parse("application/json; "+"charset=UTF-8")
RequestBody rq = RequestBody.create(mediaType, JsonUtil.objectToJson(param));//JsonUtil为自定义Json工具类
//get请求参数组装
private Request buildPostRequst(String url, Map params){
FormBody.Builder builder = new FormBody.Builder();
Map map = params;
if(map !=null) {
Set
for(String key : ks) {
String value = (String) map.get(key);
builder.add(key, value);
}
}
return new Request.Builder().url(url).post(builder.build()).build();
}
参数:一般为Map
Request postRequst = buildPostRequst(XX,Map params);
执行:
同 get请求的①同步
②异步:
执行:
同 get请求的②异步
同步、异步之上传文件至服务器:
需要用到okio,参考https://blog.csdn.net/u013210620/article/details/52422221
文件上传的参数封装要用到MultipartBody:
实体类是FileEntity为自己对File管理的实体类,关键属性:fileUrl
private RequestBody getRequestBody(Map map, List fileEntities) {
MultipartBody.Builder builder =new MultipartBody.Builder();//创建MultipartBody
builder.setType(MultipartBody.FORM);
// .Builder,用于添加请求的数据
for(Map.Entry entry : map.entrySet()) {//对键值对进行遍历
builder.addFormDataPart(entry.getKey(), entry.getValue());//把键值对添加到Builder中
}
if(!ListUtil.isEmpty(fileEntities)) {
for(inti =0; i < fileEntities.size(); i++) {//对文件进行遍历
File file =new File(fileEntities.get(i).fileUrl);//生成文件
String fileType =getMimeType(file.getName());//根据文件的后缀名,获得文件类型
builder.addFormDataPart(//给Builder添加上传的文件
fileEntities.get(i).fileNameKey,//请求的名字
file.getName(),//文件的文字,服务器端用来解析的
RequestBody.create(MediaType.parse(fileType), file)//创建RequestBody,把上传的文件放入
);
}
}
return builder.build();//根据Builder创建请求
}
private static String getMimeType(String fileUrl) {
FileNameMap filenameMap = URLConnection.getFileNameMap();
String contentType = filenameMap.getContentTypeFor(fileUrl);
if(contentType ==null) {
contentType ="application/octet-stream";//* exe,所有的可执行程序
}
return contentType;
}
异步下载图片、文件:
参考https://blog.csdn.net/u013210620/article/details/52402199
Okhttp拦截器的使用:
Okhttp监听网络请求:参考https://github.com/jgilfelt/chuck