Android Okhttp使用总结

创建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 map = aram;

if(map ==null) {

return urls ;

}

Set ks = map.keySet();

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 ks = map.keySet();

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

你可能感兴趣的:(Android Okhttp使用总结)