Java请求Http接口-OkHttp(超详细-附带工具类)
创始人
2024-11-11 19:05:52
0

简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。OkHttp启动具有现代TLS功能(SNI,ALPN)的新连接,并在握手失败时回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。对于Java,最低要求是1.7。

操作步骤:

1、创建OkhttpClient。

2、mClient执行newCall将Request转化成一个Call。

3、最后call执行excute同步执行,enqueue异步执行。

4、Request主要通过Request.Builder来构建。

5、缓存。

6、取消请求。

导包

                      com.squareup.okhttp3             okhttp             4.9.1                               commons-io             commons-io             2.5          

GET请求

get无参

/**      * 以get方式调用第三方接口      * @param url      */     public static void doGet1(String url) throws IOException {         OkHttpClient okHttpClient = new OkHttpClient();         final Request request = new Request.Builder()                 .url(url)                 .get()//默认就是GET请求,可以不写                 .build();         Response response = okHttpClient.newCall(request).execute();         String string = response.body().string();         System.out.println(string);      } 

get有参

public static void doGet2(String url, Map paramMap) throws IOException {         OkHttpClient okHttpClient = new OkHttpClient();         Request.Builder requestbuilder = new Request.Builder()                .get();//默认就是GET请求,可以不写                  StringBuilder urlbuilder = new StringBuilder(url);         if (Objects.nonNull(paramMap)) {             urlbuilder.append("?");             paramMap.forEach((key, value) -> {                 try {                     urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");                 } catch (UnsupportedEncodingException e) {                     e.printStackTrace();                 }             });             urlbuilder.deleteCharAt(urlbuilder.length() - 1);         }          Request request = requestbuilder.url(urlbuilder.toString()).build();         Response response = okHttpClient.newCall(request).execute();         String string = response.body().string();         System.out.println(string);      } 

get带参数和请求头

  /**      * 以get方式调用第三方接口      * @param url      */     public static void doGet3(String url, Map paramMap,Map heardMap) throws IOException {         OkHttpClient okHttpClient = new OkHttpClient();         Request.Builder requestbuilder = new Request.Builder()                 .get();//默认就是GET请求,可以不写          //增加参数         StringBuilder urlbuilder = new StringBuilder(url);         if (Objects.nonNull(paramMap)) {             urlbuilder.append("?");             paramMap.forEach((key, value) -> {                 try {                     urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");                 } catch (UnsupportedEncodingException e) {                     e.printStackTrace();                 }             });             urlbuilder.deleteCharAt(urlbuilder.length() - 1);         }         //增加请求头         Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString());         for (Map.Entry stringObjectEntry : heardMap.entrySet()) {             heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue());         }          Request request = heardBuilder.build();         Response response = okHttpClient.newCall(request).execute();         System.out.println(response.body().string());         System.out.println(response.message());         System.out.println(response.code());      } 

get请求 换种方式获取结果

/**      * 以get方式调用第三方接口      * @param url      */     public static void doGet(String url,Map paramMap,Map heardMap) {         OkHttpClient okHttpClient = new OkHttpClient();         Request.Builder requestbuilder = new Request.Builder()                 .get();//默认就是GET请求,可以不写          //增加参数         StringBuilder urlbuilder = new StringBuilder(url);         if (Objects.nonNull(paramMap)) {             urlbuilder.append("?");             paramMap.forEach((key, value) -> {                 try {                     urlbuilder.append(URLEncoder.encode(key, "utf-8")).append("=").append(URLEncoder.encode((String) value, "utf-8")).append("&");                 } catch (UnsupportedEncodingException e) {                     e.printStackTrace();                 }             });             urlbuilder.deleteCharAt(urlbuilder.length() - 1);         }         //增加请求头         Request.Builder heardBuilder = requestbuilder.url(urlbuilder.toString());         for (Map.Entry stringObjectEntry : heardMap.entrySet()) {             heardBuilder.addHeader(stringObjectEntry.getKey(),stringObjectEntry.getValue());         }          Request request = heardBuilder.build();         Call call = okHttpClient.newCall(request);         call.enqueue(new Callback() {             @Override             public void onFailure(Call call, IOException e) {                 System.out.println( "onFailure: ");             }              @Override             public void onResponse(Call call, Response response) throws IOException {                 System.out.println(response.body().string());                 System.out.println(response.message());                 System.out.println(response.code());             }         });     } 

POST请求

post-json传参

 /**      * post请求      * @param url      * @param json      */     public static void doPost(String url, String json, Map heardMap) throws IOException {         MediaType mediaType = MediaType.parse("application/json; charset=utf-8");         String requestBody = json;         Request.Builder requestbuilder = new Request.Builder()                 .url(url)                 .post(RequestBody.create(mediaType, requestBody));         //增加请求头         for (Map.Entry stringObjectEntry : heardMap.entrySet()) {             requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());         }          Request request = requestbuilder.build();         OkHttpClient okHttpClient = new OkHttpClient();         Response response = okHttpClient.newCall(request).execute();         System.out.println(response.body().string());         System.out.println(response.message());         System.out.println(response.code());     } 

post-params传参

 /**      * post请求      * @param url      * @param json      */     public static void doPost(String url, String json, Map heardMap) throws IOException {         MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");         String requestBody = json;         Request.Builder requestbuilder = new Request.Builder()                 .url(url)                 .post(RequestBody.create(mediaType, requestBody));         //增加请求头         for (Map.Entry stringObjectEntry : heardMap.entrySet()) {             requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());         }          Request request = requestbuilder.build();         OkHttpClient okHttpClient = new OkHttpClient();         Response response = okHttpClient.newCall(request).execute();         System.out.println(response.body().string());         System.out.println(response.message());         System.out.println(response.code());     } 
 /**      * post请求      * @param url      * @param paramMap      */     public static void doPost1(String url, Map paramMap,Map heardMap) throws IOException {         FormBody.Builder formBody = new FormBody.Builder();         if (Objects.nonNull(paramMap)) {             paramMap.forEach((x, y) -> formBody.add(x, (String) y));         }         RequestBody requestBody = formBody.build();         Request.Builder requestbuilder = new Request.Builder()                 .url(url)                 .post(requestBody);         //增加请求头         for (Map.Entry stringObjectEntry : heardMap.entrySet()) {             requestbuilder.addHeader(stringObjectEntry.getKey(), stringObjectEntry.getValue());         }          Request request = requestbuilder.build();         OkHttpClient okHttpClient = new OkHttpClient();         Response response = okHttpClient.newCall(request).execute();         System.out.println(response.body().string());         System.out.println(response.message());         System.out.println(response.code());     } 

post-表单传参-上传文件

达到类似效果
在这里插入图片描述

 public static void doPost2(String url,File file) throws IOException {         OkHttpClient client = new OkHttpClient();         RequestBody body = new MultipartBody.Builder()                 .setType(MultipartBody.FORM)                 .addFormDataPart("id", "111")                 .addFormDataPart("content", "{\"do_layout\":1}")                 .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file))                 .build();          Request request = new Request.Builder()                 .url(url)                 .post(body)                 .addHeader("x-tilake-app-key", "")                 .addHeader("x-tilake-ca-timestamp", "")                 .addHeader("x-tilake-ca-signature", "")                 .addHeader("Content-Type", body.contentType().toString())                 .addHeader("Accept", "*/*")                 .build();          try {             Response response = client.newCall(request).execute();             System.out.println(response.body().string());             System.out.println(response.message());             System.out.println(response.code());         } catch (IOException e) {             throw new RuntimeException(e);         }     } 

提供一个工具类,可以直接使用

package com.example.httpdemo.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(60, 60, 60);     }      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 url 上传文件的url      * @param fileKey       文件对应的key      * @param formDataJson  form-data参数      * @param headers      * @param file      * @return      */     public static String uploadFile(OkHttpClient okHttpClient, String url,                                      String fileKey, File file, JSONObject formDataJson, Headers headers) {         log.info("uploadFile url:{}, uploadFile formDataJson====> {}", url, formDataJson);         // 支持传文件的同时,传参数。         MultipartBody requestBody = getMultipartBody(fileKey, file,  formDataJson);          // 构建request请求体         Request request = new Request.Builder().url(url).headers(headers).post(requestBody).build();          String responseData = request(okHttpClient, url, request);          // 会在本地产生临时文件,用完后需要删除         if (file.exists()) {             file.delete();         }         return responseData;      }      /**      * 上传文件      * @param url      * @param fileKey form-data文件对应的key      * @param multipartFile 文件上传对应的 multipartFile      * @param formDataJson form-data参数      * @return      */     public static String uploadFile(String url,                                     String fileKey, MultipartFile multipartFile, JSONObject formDataJson) {         //使用默认的okHttpClient         OkHttpClient okHttpClient = getOkHttpClient();         Headers headers = new Headers.Builder().build();         return uploadFile(okHttpClient, url, fileKey, getFile(multipartFile), formDataJson, headers);     }      public static String uploadFile(OkHttpClient okHttpClient, String url,                                     String fileKey, File file, JSONObject formDataJson) {         Headers headers = new Headers.Builder().build();         return uploadFile(okHttpClient, url,  fileKey, file, formDataJson, headers);     }      /**      * 上传文件      * 使用默认的okHttpClient      *      * @param url      * @param fileKey form-data文件对应的key      * @param file 文件      * @param formDataJson form-data参数      * @return      */     public static String uploadFile(String url,                                     String fileKey, File file, JSONObject formDataJson) {         //使用默认的okHttpClient         OkHttpClient okHttpClient = getOkHttpClient();         Headers headers = new Headers.Builder().build();         return uploadFile(okHttpClient, url, fileKey, file, formDataJson, headers);     }      /**      * 上传文件用。构建form-data 参数      *      * @param fileKey       文件对应的key      * @param file          文件      * @param formDataJson  form-data参数      * @return      */     public static MultipartBody getMultipartBody(String fileKey, File file, JSONObject formDataJson) {         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 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;     }  }   

相关内容

热门资讯

4分钟辅助!天天手游辅助工具,... 4分钟辅助!天天手游辅助工具,好像存在有辅助脚本(有挂秘诀)1、起透看视 天天手游辅助工具辅助软件价...
7分钟辅助!微乐小程序自建房辅... 7分钟辅助!微乐小程序自建房辅助,都是有辅助方法(有人有挂)1、玩家可以在微乐小程序自建房辅助线上大...
2分钟辅助!约局吧辅助器,本来... 2分钟辅助!约局吧辅助器,本来真的有辅助插件(的确有挂)1、约局吧辅助器破解器简单,约局吧辅助器机器...
三分钟辅助!微乐自建房辅助工具... 三分钟辅助!微乐自建房辅助工具,确实有辅助挂(存在有挂)1、很好的工具软件,可以解锁游戏的微乐自建房...
8分钟辅助!巴郎新疆开挂,一直... 8分钟辅助!巴郎新疆开挂,一直有辅助工具(有挂详情)1、巴郎新疆开挂透视辅助软件激活码多个强度级别选...
五分钟辅助!温州茶苑手机辅助器... 五分钟辅助!温州茶苑手机辅助器,好像真的有辅助软件(有挂技巧)1、每一步都需要思考,不同水平的挑战温...
两分钟辅助!白金岛手游的作弊码... 两分钟辅助!白金岛手游的作弊码,其实真的是有辅助挂(有挂细节)1、白金岛手游的作弊码免费辅助多个强度...
八分钟辅助!极速暗宝辅助,一贯... 八分钟辅助!极速暗宝辅助,一贯真的有辅助技巧(有挂神器)1、许多玩家不知道极速暗宝辅助辅助怎么退出观...
一分钟辅助!创乐源辅助软件,果... 一分钟辅助!创乐源辅助软件,果然有辅助工具(有挂讲解)1、一分钟辅助!创乐源辅助软件,果然有辅助工具...
8分钟辅助!微乐自建房辅助多少... 8分钟辅助!微乐自建房辅助多少钱一个月,真是真的是有辅助工具(有挂讲解)小薇(辅助器软件下载)致您一...