美文网首页
Android Okhttp使用总结

Android Okhttp使用总结

作者: 诗和远方hunk | 来源:发表于2018-10-12 18:35 被阅读60次

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

    if(map ==null) {

    return urls ;

    }

    Set<String> 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<String> 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使用总结

          本文链接:https://www.haomeiwen.com/subject/bzwgaftx.html