美文网首页
okhttp2封装

okhttp2封装

作者: 岁月静好忄 | 来源:发表于2019-03-20 13:20 被阅读0次
  • OkHttpClientManager.java
    封装了get、unGet(post、put、delete)的同步和异步请求
  • ResultCallback.java
    定义了异步请求返回结果
  • RequestMethod.java
    请求方法枚举类

OkHttpClientManager.java

import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.vking.luke.common.RequestMethod;
/**
 * okhttp2客户端
 */
public class OkHttpClientManager
{
    private static OkHttpClientManager okHttpClientManager;
    private OkHttpClient okHttpClient;
    private String token;
    private OkHttpClientManager()
    {
        this.okHttpClient = new OkHttpClient();
    }
    
    public static OkHttpClientManager getInstance() {
        if (okHttpClientManager == null) {
            synchronized (OkHttpClientManager.class) {
                if (okHttpClientManager == null) {
                    okHttpClientManager = new OkHttpClientManager();
                }
            }
        }
        return okHttpClientManager;
    }
    
    
    /**
     * 同步get
     * @param url 访问地址
     * @param params 访问参数
     * @return 请求结果
     * @throws IOException
     */
    public Response get(String url,Map<String,String> params) throws IOException
    {
        
        Request request = this.getBase(url, params);
        return okHttpClient.newCall(request).execute();
    
    }
    
    /**
     * 异步get
     * @param url 访问地址
     * @param params 访问参数
     * @param resultCallback 回调
     */
    public void getAsyn(String url,Map<String,String> params,
            ResultCallback resultCallback)
    {
        Request request = this.getBase(url, params);
        responseResult(resultCallback, request);
    }

    /**
     * 异步unGet(携带文件)
     * @param url 访问地址
     * @param params 参数
     * @param file 文件
     * @param fileKey 文件键值
     * @param resultCallback 结果回调
     */
    public void unGetFileAsyn(String url,Map<String,String> params,
            File file,String fileKey,ResultCallback resultCallback,RequestMethod method)
    {
        if(params==null)
        {
            params = new HashMap<String,String>();
        }
        Request request = this.buildMultipartFormRequest(url, file, fileKey, params,method);
        responseResult(resultCallback, request);
    }
    
    /**
     * 同步unGet(携带文件)
     * @param url 访问地址
     * @param params 参数
     * @param file 文件
     * @param fileKey 文件键值
     * @return Response
     * @exception IOException
     */
    public Response unGetFile(String url,Map<String,String> params,
            File file,String fileKey,RequestMethod method) throws IOException
    {
        if(params==null)
        {
            params = new HashMap<String,String>();
        }
        Request request = this.buildMultipartFormRequest(url, file, fileKey, params,method);
        return okHttpClient.newCall(request).execute();
    }
    

    /**
     * 异步unGet(不携带文件)
     * @param url 访问地址
     * @param params 参数
     * @param resultCallback 结果回调
     */
    public void unGetAsyn(String url, Map<String, String> params,
            ResultCallback resultCallback,RequestMethod method)
    {
        Request request = this.unGetBase(url, params, method);
        responseResult(resultCallback, request);
    }
    
    /**
     * 同步unGet(不携带文件)
     * @param url 访问地址
     * @param params 参数
     * @return Response
     * @exception IOException
     */
    public Response unGet(String url, Map<String, String> params,RequestMethod method) throws IOException
    {
        Request request = this.unGetBase(url, params, method);
        return okHttpClient.newCall(request).execute();
    }
    
    
    /**
     * unGet文件参数创建 
     * @param url 访问地址
     * @param params 参数
     * @param file 文件
     * @param fileKey 文件键值
     * @return Request
     */
    private Request buildMultipartFormRequest(String url, File file,
            String fileKey, Map<String,String> params,RequestMethod method)
    {
        
        MultipartBuilder builder = new MultipartBuilder()
                .type(MultipartBuilder.FORM);
        
        for(Map.Entry<String, String> entry:params.entrySet())
        {
            builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""),
                    RequestBody.create(null, entry.getValue()));

        }
        
        if (file != null)
        {
            String fileName = file.getName();
            RequestBody fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
            builder.addPart(Headers.of("Content-Disposition",
                    "form-data; name=\"" + fileKey + "\"; filename=\"" + fileName + "\""),
            fileBody);

        }
        RequestBody requestBody = builder.build();
        
        switch(method.getValue())
        {
        case "POST":
            return new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .header("token", token)
                    .build();
        case "PUT":
            return new Request.Builder()
                    .url(url)
                    .put(requestBody)
                    .header("token", token)
                    .build();
        case "DELETE":
            return new Request.Builder()
                    .url(url)
                    .delete(requestBody)
                    .header("token", token)
                    .build();
        default:
            return new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .header("token", token)
                    .build();
            
        }
    
    }
    
    
    /**
     * get 同步和异步公共方法
     * @param url 访问地址
     * @param params 访问参数
     * @return Request
     */
    private Request getBase(String url,Map<String,String> params)
    {
        if(params==null)
        {
            params = new HashMap<String,String>();
        }
        String requestUrl = url + "?";
        for(Map.Entry<String, String> entry : params.entrySet())
        {
            requestUrl = requestUrl + entry.getKey() + "=" + entry.getValue() + "&";
        }
        return new Request.Builder()
                .url(requestUrl)
                .header("token", token)
                .build();
    }
    
    /**
     * unGet 同步异步公共方法 
     * @param url 访问地址
     * @param params 参数
     */
    private Request unGetBase(String url, Map<String, String> params, RequestMethod method)
    {
        if(params==null)
        {
            params = new HashMap<String,String>();
        }
        FormEncodingBuilder builder = new FormEncodingBuilder();
        for(Map.Entry<String, String> entry:params.entrySet())
        {
            builder.add(entry.getKey(), entry.getValue());
        }
        RequestBody requestBody = builder.build();
        
        
        switch(method.getValue())
        {
        case "POST":
            return new Request.Builder()
                    .url(url)
                    .header("token", token)
                    .post(requestBody)
                    .build();
        case "PUT":
            return new Request.Builder()
                    .url(url)
                    .header("token", token)
                    .put(requestBody)
                    .build();
        case "DELETE":
            return new Request.Builder()
                    .url(url)
                    .header("token", token)
                    .delete(requestBody)
                    .build();
        default:
            return new Request.Builder()
                    .url(url)
                    .header("token", token)
                    .post(requestBody)
                    .build();
            
        }
    }
    
    
    /**
     * 异步监听回调 
     */
    private void responseResult(ResultCallback resultCallback,Request request)
    {
        okHttpClient.newCall(request).enqueue(new Callback(){

            @Override
            public void onFailure(Request request, IOException e) {
                
                if(resultCallback!=null)
                {
                    resultCallback.onfail(request, e);
                }
            }

            @Override
            public void onResponse(Response response) throws IOException {
                
                if(resultCallback!=null)
                {
                    resultCallback.onsucess(response);
                }
                
            }
            
        });
    }
    
    /**
     * 获取文件的类型 
     */
    private String guessMimeType(String path) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String contentTypeFor = fileNameMap.getContentTypeFor(path);
        if (contentTypeFor == null) {
            contentTypeFor = "application/octet-stream";
        }
        return contentTypeFor;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
    
}

ResultCallback.java (异步回调)

import java.io.IOException;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
/**
 * 异步结果回调 
 */
public interface ResultCallback 
{
    void onsucess(Response response);
    void onfail(Request request,IOException e);
}

RequestMethod.java(请求方法枚举)

/**
 * 请求方法枚举类
 */
public enum RequestMethod
{
    GET("GET"),POST("POST"),DELETE("DELETE"),PUT("PUT");
    
    private final String value;
    RequestMethod(String value)
    {
        this.value = value;
    }
    
     public String getValue() {
         return value;
     }
}

调用

OkHttpClientManager.getInstance().setToken(TOKEN);
Response response = OkHttpClientManager.getInstance().get(url, params);

相关文章

  • 2019-03-07 Mvp 简单封装

    本篇是 Mvp + okhttp2 + retrofit2 + rxjava2 的简单封装 定义一个 BaseVi...

  • okhttp2封装

    OkHttpClientManager.java封装了get、unGet(post、put、delete)的同步和...

  • 使用OkHttp高效开发调试

    本文使用的OkHttp版本是okhttp3,使用okhttp2的情况稍有不同,使用okhttp2的同学替换为okh...

  • okhttp2

    okhttp分享2:okhttp的线程管理及任务分发 一、线程池 上文主要分析了同步请求的大致流程,现在我们来看一...

  • Android 开发集锦

    效果图 技术要点 1、Retrofit + RXJava + OKHttp2、skinlibrary 换肤机制3、...

  • Day22-Retrofit

    tips 解特殊json okhttp2 -> 3, 将set模式改成了builder模式 Retrofit使用F...

  • Android Volley框架整合升级OkHttp3.3问题

    我们以前的Android项目网络框架是基于Volley和OKHttp2。现在由于Aliyun SDK升级和整合Re...

  • JavaScript面向对象与设计模式

    1. 面向对象 1.1 封装 封装的目的在于将信息隐藏。广义的封装不仅包括封装数据和封装实现,还包括封装类型和封装...

  • 02.OOP面向对象-3.一些理解

    对封装的理解?封装,类本身就是一个封装,封装了属性和方法。方法也是封装,对一些业务逻辑的封装。私有也是封装,将一些...

  • 封装微信小程序请求

    封装wx.request 封装api 封装请求调用

网友评论

      本文标题:okhttp2封装

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