首页 > 其他分享 >OkHttp 工具类

OkHttp 工具类

时间:2023-04-26 22:56:09浏览次数:49  
标签:return String url param okHttpClient headers OkHttp 工具

OkHttp依赖包:

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
        

基于JSONObject的OkHttp工具类:

如果不喜欢用 json 做参数,可以跳过,看后面的 基于map的OkHttp工具类:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;


@Slf4j
public class OkHttpUtil {

    public static final String MEDIA_TYPE_JSON = "application/json; charset=utf-8";

    private OkHttpUtil() {
    }

    /**
     * 获取默认的OkHttpClient
     * @return
     */
    public static OkHttpClient getOkHttpClient() {
        return getOkHttpClient(10, 10, 10);
    }

    public static OkHttpClient getOkHttpClient(int connectTimeout, int readTimeOut, int writeTimeOut) {
        OkHttpClient.Builder builder = new okhttp3.OkHttpClient().newBuilder();
        builder.connectTimeout(connectTimeout, TimeUnit.SECONDS);
        builder.readTimeout(readTimeOut, TimeUnit.SECONDS);
        builder.writeTimeout(writeTimeOut, TimeUnit.SECONDS);
        return builder.build();
    }

    /**
     * get请求
     * @param okHttpClient
     * @param url
     * @param headers header参数
     * @return
     */
    public static String get(OkHttpClient okHttpClient, String url, Headers headers) {
        log.info("okHttpClient get url:{}.", url);
        Request request = new Request.Builder().url(url).headers(headers).get().build();

        String responseData = request(okHttpClient, url, request);
        log.info("okHttpClient get url:{},request responseData====> {}", url, responseData);
        return responseData;
    }

    public static String get(OkHttpClient okHttpClient, String url) {
        Headers headers = new Headers.Builder().build();
        return get( okHttpClient, url, headers);
    }

    /**
     * GET请求。使用默认的 okHttpClient 和 headers
     * @param url
     * @return
     */
    public static String get(String url) {
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        return get( okHttpClient, url, headers);
    }

    /**
     * post请求,获取响应结果
     *
     * @param okHttpClient
     * @param url
     * @param bodyJson
     * @param headers
     * @return
     */
    public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson, Headers headers) {
        log.info("okHttpClient post url:{}, body====> {}", url, bodyJson);
        MediaType mediaTypeJson = MediaType.parse(MEDIA_TYPE_JSON);
        RequestBody requestBody = RequestBody.create(mediaTypeJson, JSON.toJSONString(bodyJson));
        Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();

        String responseData = request(okHttpClient, url, request);
        log.info("okHttpClient post url:{},post responseData====> {}", url, responseData);
        return responseData;
    }

    public static String post(OkHttpClient okHttpClient, String url, JSONObject bodyJson) {
        Headers headers = new Headers.Builder().build();
        return post( okHttpClient,  url,  bodyJson, headers);
    }

    /**
     * post请求。使用默认的 okHttpClient 和 headers
     * @param url
     * @param bodyJson
     * @return
     */
    public static String post( String url, JSONObject bodyJson) {
        //使用默认的 okHttpClient
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        //如果需要自定义 okHttpClient或headers传参,可以调用以下方法
        return post( okHttpClient,  url,  bodyJson, headers);
    }

    /**
     * 获取响应结果
     *
     * @param okHttpClient
     * @param url
     * @param request
     * @return
     */
    public static String request(OkHttpClient okHttpClient, String url, Request request) {
        String responseData = "";
        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response != null && response.body() != null) {
                return response.body().string();
            }
        } catch (Exception e) {
            log.error("okHttpClient getResponse error.url:{}", url, e);
        }

        return responseData;
    }

    /**
     * 上传文件
     *
     * @param okHttpClient  okHttp客户端
     * @param uploadFileUrl 上传文件的url
     * @param multipartFile 文件对应的multipartFile
     * @param fileKey       文件对应的key
     * @param formDataJson  form-data参数
     * @param headers
     * @return
     */
    public static String uploadFile(OkHttpClient okHttpClient, String uploadFileUrl,
                                    MultipartFile multipartFile, String fileKey, JSONObject formDataJson, Headers headers) {
        log.info("uploadFile url:{}, uploadFile formDataJson====> {}", uploadFileUrl, formDataJson);
        // 支持传文件的同时,传参数。
        MultipartBody requestBody = getMultipartBody(multipartFile, fileKey, formDataJson);

        // 构建request请求体
        Request request = new Request.Builder().url(uploadFileUrl).headers(headers).post(requestBody).build();

        String responseData = request(okHttpClient, uploadFileUrl, request);

        File file = getFile(multipartFile);
        // 会在本地产生临时文件,用完后需要删除
        if (file.exists()) {
            file.delete();
        }
        return responseData;

    }

    public static String uploadFile(OkHttpClient okHttpClient, String uploadFileUrl,
                                    MultipartFile multipartFile, String fileKey, JSONObject formDataJson) {
        Headers headers = new Headers.Builder().build();
        return uploadFile(okHttpClient, uploadFileUrl, multipartFile, fileKey, formDataJson, headers);
    }

    /**
     * 上传文件
     * @param uploadFileUrl
     * @param multipartFile
     * @param fileKey form-data文件对应的key
     * @param formDataJson form-data参数
     * @return
     */
    public static String uploadFile( String uploadFileUrl,
                                    MultipartFile multipartFile, String fileKey, JSONObject formDataJson) {
        //使用默认的okHttpClient
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        return uploadFile(okHttpClient, uploadFileUrl, multipartFile, fileKey, formDataJson, headers);
    }

    /**
     * 上传文件用。构建form-data 参数
     *
     * @param multipartFile 文件对应的multipartFile
     * @param fileKey       文件对应的key
     * @param formDataJson  form-data参数
     * @return
     */
    public static MultipartBody getMultipartBody(MultipartFile multipartFile, String fileKey, JSONObject formDataJson) {
        File file = getFile(multipartFile);
        RequestBody fileBody = RequestBody.create(MultipartBody.FORM, file);

        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();
        // 设置传参为form-data格式
        bodyBuilder.setType(MultipartBody.FORM);
        bodyBuilder.addFormDataPart(fileKey, file.getName(), fileBody);
        // 添加 form-data参数
        for (Map.Entry<String, Object> entry : formDataJson.entrySet()) {
            //参数通过 bodyBuilder.addFormDataPart(key, value) 添加
            bodyBuilder.addFormDataPart(entry.getKey(), Objects.toString(entry.getValue(),""));
        }
        return bodyBuilder.build();
    }

    /**
     * 获取文件
     * @param multipartFile
     * @return
     */
    public static File getFile(MultipartFile multipartFile) {
        File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
        try {
            FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
        } catch (IOException e) {
            log.error("copyInputStreamToFile error.", e);
        }
        return file;
    }

}

okHttp配置类

如果使用的是SpringBoot,也可以用 @Configuration 配置一下okHttp。

如果不想配置,也可以直接用默认的。

@Configuration
public class OkHttpConfig {

    @Bean
    public OkHttpClient okHttpClient() {
        OkHttpClient.Builder builder = new okhttp3.OkHttpClient().newBuilder();
        builder.connectTimeout(10, TimeUnit.SECONDS);
        builder.readTimeout(10, TimeUnit.SECONDS);
        builder.writeTimeout(10, TimeUnit.SECONDS);

        return builder.build();
    }
}

配置好了之后,直接用 @Autowired 实例化。

    @Autowired
    private OkHttpClient okHttpClient;

使用示例:

  • POST请求:
@Test
public void testPost()  {
	//bean对象转json
    JSONObject json = (JSONObject) JSONObject.toJSON(bean);
    String url = "http://xx.xx.xx.xx:8080/xx/xx";

    String response = OkHttpUtil.post( url, json);
}
  • GET请求:
@Test
public void testGet() {

    String url = "http://xx.xx.xx.xx:8080/xx/xx";

    String response = OkHttpUtil.get( url);
} 
  • 上传文件:
@Test
public void testUploadFile() throws Exception {
	//表单的key和value
    JSONObject formDataJson = new JSONObject();
    formDataJson.put("XX", "XX");

    // 上传文件, 采用form-data格式, multipartFile类从spring控制层拿到,"fileData"为文件对应的key
    String responseData = OkHttpUtil.uploadFile(url, multipartFile, "fileData", formDataJson);

}

对应的postman请求如下:

基于Map的OkHttp 工具类:

如果不喜欢用 json 做参数,可以用以下的基于 map 的OkHttp工具类:

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;


@Slf4j
public class OkHttpUtil {

    public static final String MEDIA_TYPE_JSON = "application/json; charset=utf-8";

    private OkHttpUtil() {
    }

    /**
     * 获取默认的OkHttpClient
     * @return
     */
    public static OkHttpClient getOkHttpClient() {
        return getOkHttpClient(10, 10, 10);
    }

    public static OkHttpClient getOkHttpClient(int connectTimeout, int readTimeOut, int writeTimeOut) {
        OkHttpClient.Builder builder = new okhttp3.OkHttpClient().newBuilder();
        builder.connectTimeout(connectTimeout, TimeUnit.SECONDS);
        builder.readTimeout(readTimeOut, TimeUnit.SECONDS);
        builder.writeTimeout(writeTimeOut, TimeUnit.SECONDS);
        return builder.build();
    }

    /**
     * get请求
     * @param okHttpClient
     * @param url
     * @param headers header参数
     * @return
     */
    public static String get(OkHttpClient okHttpClient, String url, Headers headers) {
        log.info("okHttpClient get url:{}.", url);
        Request request = new Request.Builder().url(url).headers(headers).get().build();

        String responseData = request(okHttpClient, url, request);
        log.info("okHttpClient get url:{},request responseData====> {}", url, responseData);
        return responseData;
    }

    public static String get(OkHttpClient okHttpClient, String url) {
        Headers headers = new Headers.Builder().build();
        return get( okHttpClient, url, headers);
    }

    /**
     * GET请求。使用默认的 okHttpClient 和 headers
     * @param url
     * @return
     */
    public static String get(String url) {
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        return get( okHttpClient, url, headers);
    }

    /**
     * post请求,获取响应结果
     *
     * @param okHttpClient
     * @param url
     * @param map
     * @param headers
     * @return
     */
    public static String post(OkHttpClient okHttpClient, String url, Map<String,Object> map, Headers headers) {
        log.info("okHttpClient post url:{}, body====> {}", url, map);
        MediaType mediaTypeJson = MediaType.parse(MEDIA_TYPE_JSON);
        //map需要转成json字符串
        RequestBody requestBody = RequestBody.create(mediaTypeJson, JSON.toJSONString(map));
        Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();

        String responseData = request(okHttpClient, url, request);
        log.info("okHttpClient post url:{},post responseData====> {}", url, responseData);
        return responseData;
    }


    public static String post(OkHttpClient okHttpClient, String url, Map<String,Object> map) {
        Headers headers = new Headers.Builder().build();
        return post( okHttpClient,  url,  map, headers);
    }

    /**
     * post请求。使用默认的 okHttpClient 和 headers
     * @param url
     * @param map
     * @return
     */
    public static String post( String url, Map<String,Object> map) {
        //使用默认的 okHttpClient
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        //如果需要自定义 okHttpClient或headers传参,可以调用以下方法
        return post( okHttpClient,  url,  map, headers);
    }

    /**
     * 获取响应结果
     *
     * @param okHttpClient
     * @param url
     * @param request
     * @return
     */
    public static String request(OkHttpClient okHttpClient, String url, Request request) {
        String responseData = "";
        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response != null && response.body() != null) {
                return response.body().string();
            }
        } catch (Exception e) {
            log.error("okHttpClient getResponse error.url:{}", url, e);
        }

        return responseData;
    }

    /**
     * 上传文件
     *
     * @param okHttpClient  okHttp客户端
     * @param uploadFileUrl 上传文件的url
     * @param multipartFile 文件对应的multipartFile
     * @param fileKey       文件对应的key
     * @param map  form-data参数
     * @param headers
     * @return
     */
    public static String uploadFile(OkHttpClient okHttpClient, String uploadFileUrl,
                                    MultipartFile multipartFile, String fileKey, Map<String,Object> map, Headers headers) {
        log.info("uploadFile url:{}, uploadFile formDataJson====> {}", uploadFileUrl, map);
        // 支持传文件的同时,传参数。
        MultipartBody requestBody = getMultipartBody(multipartFile, fileKey, map);

        // 构建request请求体
        Request request = new Request.Builder().url(uploadFileUrl).headers(headers).post(requestBody).build();

        String responseData = request(okHttpClient, uploadFileUrl, request);

        File file = getFile(multipartFile);
        // 会在本地产生临时文件,用完后需要删除
        if (file.exists()) {
            file.delete();
        }
        return responseData;

    }

    public static String uploadFile(OkHttpClient okHttpClient, String uploadFileUrl,
                                    MultipartFile multipartFile, String fileKey, Map<String,Object> map) {
        Headers headers = new Headers.Builder().build();
        return uploadFile(okHttpClient, uploadFileUrl, multipartFile, fileKey, map, headers);
    }

    /**
     * 上传文件
     * @param uploadFileUrl
     * @param multipartFile
     * @param fileKey form-data文件对应的key
     * @param map form-data参数
     * @return
     */
    public static String uploadFile( String uploadFileUrl,
                                     MultipartFile multipartFile, String fileKey, Map<String,Object> map) {
        //使用默认的okHttpClient
        OkHttpClient okHttpClient = getOkHttpClient();
        Headers headers = new Headers.Builder().build();
        return uploadFile(okHttpClient, uploadFileUrl, multipartFile, fileKey, map, headers);
    }

    /**
     * 上传文件用。构建form-data 参数
     *
     * @param multipartFile 文件对应的multipartFile
     * @param fileKey       文件对应的key
     * @param formDataMap  form-data参数
     * @return
     */
    public static MultipartBody getMultipartBody(MultipartFile multipartFile, String fileKey, Map<String,Object> formDataMap) {
        File file = getFile(multipartFile);
        RequestBody fileBody = RequestBody.create(MultipartBody.FORM, file);

        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();
        // 设置传参为form-data格式
        bodyBuilder.setType(MultipartBody.FORM);
        bodyBuilder.addFormDataPart(fileKey, file.getName(), fileBody);
        // 添加 form-data参数
        for (Map.Entry<String, Object> entry : formDataMap.entrySet()) {
            //参数通过 bodyBuilder.addFormDataPart(key, value) 添加
            bodyBuilder.addFormDataPart(entry.getKey(), Objects.toString(entry.getValue(),""));
        }
        return bodyBuilder.build();
    }

    /**
     * 获取文件
     * @param multipartFile
     * @return
     */
    public static File getFile(MultipartFile multipartFile) {
        File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
        try {
            FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
        } catch (IOException e) {
            log.error("copyInputStreamToFile error.", e);
        }
        return file;
    }

}

Bean和Map的转换工具

如果使用基于 map 的OkHttp工具类,需要传map做参数时,可以用 Bean和Map转换的工具类。
详情见: https://www.cnblogs.com/expiator/p/17357352.html

标签:return,String,url,param,okHttpClient,headers,OkHttp,工具
From: https://www.cnblogs.com/expiator/p/17357647.html

相关文章

  • 原型设计工具比较及实践
    目录一、原型设计工具比较1.墨刀2.Axure3.Mockplus二、原型设计1.主题名称2.功能3.界面设计考虑因素4.切换界面5.界面切换流程 一、原型设计工具比较1.墨刀适用领域墨刀适用于需要设计和原型制作的领域,从最初的草图到高保真的用户界面设计和......
  • 原型设计工具比较及实践
    一.原型设计工具比较墨刀使用领域:墨刀有PC端、手机端、网页版等各种版本,适合项目经理设计师,开发人员等使用优点:自带成熟的组件,使用方便产品界面简洁易用,学习成本和切换成本低APP原型可以下载到手机,方便用户预览原型原型可以分享网页链接缺点:不能画流程图,相较其他工具......
  • gitleaks 保护以及发现安全key的工具
    gitleaks可以方便的扫描git项目,发现潜在的key泄漏问题,可以方便的集成到我们的ci/cd中说明对于需要发现代码中安全key的问题,gitleaks是一个值得使用的工具参考资料https://github.com/gitleaks/gitleakshttps://gitleaks.io/......
  • 汇总|React Native 开发工具一赏
    传统的开发中,按照平台划分为iOS,Android,Windows和Mac。其中,随着移动设备的使用移动端应用的开发也越来越多。传统上iOS应用使用Xcode工具、Objective-C和Swift语言进行开发,Android应用使用AndroidStudio工具、Java和kotlin语言进行开发。随着开发的普及......
  • python打包工具-Nuitka
    nuitka将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。提高安全性和运行速度。github:https://github.com/2267770481/cython_test安装pipinstallnuitkapipinstallordered-set#加速编译pipinstallzstandard#onefile时压缩文件......
  • 原型设计工具比较及实践
    一、原型设计工具比较1.墨刀适用领域墨刀为北京磨刀刻石科技有限公司旗下一款在线原型设计与协作工具产品,用户群体包括:产品经理、设计、研发、运营销售、创业者等优点.近乎完美的原型演示效果,几乎可以以假乱真,适合产品设计确认与交互验证。.丰富的元件,无需自己编写直接......
  • 原型设计工具比较与实现
    目录一.原型设计工具优缺点比较1.墨刀2.Axure3.Mockplus二.原型设计1.主题名称2.功能3.界面设计考虑因素4.界面切换介绍1.联系人主页面2.个人页面3.设置备注和标签4.设置权限5.新的朋友6.添加朋友7.扫一扫8.个人二维码5.界面切换流程图一原型设......
  • 原型设计工具对比及实践
    一、原型设计工具对比墨刀适用领域:墨刀是一款打通产设研团队,实现原型,设计,流程,思维导图一体化的在线协同工具。优点:1.丰富的元件,无需自己编写直接使用。      2.非常方便分享给他人,预览速度非常快。      3.提供非常多的元件,使用户可以快速创作原型。......
  • 原型设计工具比较及实践
    目录:一.    原型设计工具的优缺点比较二.    原型设计作业原型设计工具比较1.墨刀背景及适用范围:墨刀是一款在线的移动应用原型与线框图工具,借助墨刀,创业者、产品经理及UI/UX设计师等用户群体能够快速搭建移动应用产品原型,演示项目效果;同时墨刀也可作为协作平台,项目......
  • 原型设计工具比较及实践
    一、原型设计工具比较1、墨刀(1)、简介:墨刀为北京磨刀刻石科技有限公司旗下一款在线原型设计与协作工具产品,用户群体包括:产品经理、设计、研发、运营销售、创业者等。(2)优点:操作简单:简单拖拽和设置,即可将想法、创意变成产品原型。演示:真机设备边框、沉浸感全屏、离线模式等多种......