OkHttpClient请求方式详解,及常用OkHttpUtils配置工具类

这篇具有很好参考价值的文章主要介绍了OkHttpClient请求方式详解,及常用OkHttpUtils配置工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OkHttpClient使用详解,及使用连接池的OkHttpUtils工具类

HTTP是现代应用程序联网的方式。这是我们交换数据和媒体的方式。高效地使用HTTP可以使您的内容加载更快,并节省带宽。

OkHttp是一个HTTP客户端,默认情况下是高效的:

  • HTTP/2支持允许对同一主机的所有请求共享一个套接字。
  • 连接池可以减少请求延迟(如果HTTP/2不可用)。
  • 透明GZIP压缩下载大小。
  • 响应缓存完全避免了重复请求的网络。

当网络出现问题时,OkHttp会坚持下去:它会从常见的连接问题中静默地恢复。如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试替代地址。这对于IPv4+IPv6以及托管在冗余数据中心的业务是必要的。OkHttp支持现代TLS特性(TLS 1.3, ALPN,证书固定)。它可以配置为后退以获得广泛连接。

使用OkHttp很简单。它的请求/响应API采用流畅构建器和不可变设计。它既支持同步阻塞调用,也支持带回调的异步调用。

github链接地址: (GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.)

官方项目地址:[Overview - OkHttp (square.github.io)](https://square.github.io/okhttp/)

请求方法详解

我们编写了一些方法,演示如何使用 OkHttp 解决常见问题。通读它们,了解一切如何协同工作。自由剪切和粘贴这些示例;这就是他们的目的。

Get

import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class GetExample {
  final OkHttpClient client = new OkHttpClient();

  String run(String url) throws IOException {
    Request request = new Request.Builder()
        .url(url)
        .build();

    try (Response response = client.newCall(request).execute()) {
      return response.body().string();
    }
  }

  public static void main(String[] args) throws IOException {
    GetExample example = new GetExample();
    String response = example.run("https://raw.github.com/square/okhttp/master/README.md");
    System.out.println(response);
  }
}

POST

import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class PostExample {
  public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

  final OkHttpClient client = new OkHttpClient();

  String post(String url, String json) throws IOException {
    RequestBody body = RequestBody.create(json, JSON);
    Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
    try (Response response = client.newCall(request).execute()) {
      return response.body().string();
    }
  }

  String bowlingJson(String player1, String player2) {
    return "{'winCondition':'HIGH_SCORE',"
        + "'name':'Bowling',"
        + "'round':4,"
        + "'lastSaved':1367702411696,"
        + "'dateStarted':1367702378785,"
        + "'players':["
        + "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39},"
        + "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}"
        + "]}";
  }

  public static void main(String[] args) throws IOException {
    PostExample example = new PostExample();
    String json = example.bowlingJson("Jesse", "Jake");
    String response = example.post("http://www.roundsapp.com/post", json);
    System.out.println(response);
  }
}

Asynchronous Get

OkHttp提供enqueue方法来异步执行请求,并提供一个Callback方法来处理回调。

案例:在工作线程上下载一个文件,并在响应可读时返回。回调是在响应标头准备好之后执行的,读取响应体可能仍然会阻塞。OkHttp现阶段不提供异步api来接收响应体。

private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Call call, IOException e) {
        e.printStackTrace();
      }

      @Override public void onResponse(Call call, Response response) throws IOException {
        try (ResponseBody responseBody = response.body()) {
          if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

          Headers responseHeaders = response.headers();
          for (int i = 0, size = responseHeaders.size(); i < size; i++) {
            System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
          }

          System.out.println(responseBody.string());
        }
      }
    });
  }

上述简单介绍了主要的几种请求方式的案例,其它的请求方式皆可根据上述进行眼神。

更多案例详情,比如Post方式提交String, Post方式提交流,响应缓存等,可以参考官网的请求案例讲解:

[Recipes - OkHttp (square.github.io)](https://square.github.io/okhttp/recipes/)

OkHttpUtils工具类

@Slf4j
public class OkHttpUtils {

	// 方式一
    private static OkHttpClient okHttpClient = null;
    
    public static OkHttpClient getOkHttpClient(){
        if (okHttpClient != null){
            return okHttpClient;
        }

        // 加锁
        synchronized (OkHttp3Demo.class){
            // 自定义连接池最大空闲连接数和等待时间大小,否则默认最大10个空闲连接
            ConnectionPool connectionPool = new ConnectionPool(32, 10, TimeUnit.MINUTES);
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(30, TimeUnit.SECONDS) // 连接超时
                    .writeTimeout(20,TimeUnit.SECONDS)  // 写入超时
                    .readTimeout(20,TimeUnit.SECONDS) // 读取超时
                    .connectionPool(connectionPool)	// 
                    // .addInterceptor() 添加应用拦截器
                    // .addNetworkInterceptor() 添加网络拦截器
                    // .cache() 设置缓存
                    .build();
        }
        return client;
    }
    
        // 创建OkHttpClient对象, 并设置超时时间 
    private static final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .build();

    /**
     * 同步GET请求
     *
     * @param url 请求地址
     */
    public static String getRequest(String url) {
        try {
            // 1 创建OkHttpClient对象 
            // 2 构建Request对象
            Request request = new Request.Builder()
                    .get()// 不写默认为GET请求
                    .url(url)
                    .build();
            // 3 发起请求获取响应值
            Response response = client.newCall(request).execute();
            // 4 根据响应结果判断
            if (response.isSuccessful()) {
                return response.body().string();
            } else {
                throw new RuntimeException("请求异常,错误码为: " + response.code());
            }
        } catch (Exception e) {
            log.info("请求失败,错误信息为= {} ", e.getMessage());
        }
        return null;
    }
    
    /**
     * 同步POST请求
     *
     * @param url 请求地址
     * @param params 请求参数
     */
    public static String postRequest(String url, Map<String, String> params) {

        try {
            // 1 创建OkHttpClient对象
            // 2 构建请求体
            MultipartBody body = new MultipartBody.Builder()
                    .setType(MediaType.parse("multipart/form-data"))
                    .addFormDataPart("username", params.get("username"))
                    .addFormDataPart("password", params.get("password"))
                    .build();
            // 3 构建Request对象
            Request request = new Request.Builder()
                    .post(body)
                    .url(url)
                    .build();
            // 4 发起请求获取响应值
            Response response = client.newCall(request).execute();

            // 5 根据响应结果判断
            if (response.isSuccessful()) {
                return response.body().string();
            } else {
                throw new RuntimeException("请求异常,错误码为: " + response.code());
            }
        } catch (Exception e) {
            log.info("请求失败,错误信息为= {} ", e.getMessage());
        }
        return null;
    }
    
    
    /**
     * 同步GET请求
     */
    public static String getRequest(String url) throws IOException {
        Request request = new Builder().url(url).build();
        Response response = execute(request);

        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            throw new ArithmeticException("请求异常,错误码为: " + response.code());
        }

    }

    /**
     * 同步请求
     */
    public static Response execute(Request request) throws IOException {
        return client.newCall(request).execute();
    }
    
    /**
     * 开启异步线程访问网络, 需要返回结果
     */
    public static void enqueue(Request request, Callback callback) {
        client.newCall(request).enqueue(callback);
    }

    /**
     * 开启异步线程访问网络,不需要返回结果( Callback 返回为空)
     */
    public static void enqueue(Request request) {
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                log.info("请求失败,异常信息为: {} ", e.getMessage());
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response)
                    throws IOException {
                log.info("请求成功");
            }
        });
    }
    
}

参考文献:

Java中发送Http请求之OkHttpClient文章来源地址https://www.toymoban.com/news/detail-675956.html

到了这里,关于OkHttpClient请求方式详解,及常用OkHttpUtils配置工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot GET和POST请求的常用参数获取方式

    可以在控制器方法的参数上使用@RequestParam注解来获取请求中的参数值。例如: 可以为@RequestParam注解的参数提供默认值,以处理参数缺失的情况。例如: 可以使用@RequestParam MapString, String来获取所有的请求参数键值对。例如: 如果参数是作为路径的一部分传递的,可以使用

    2024年02月10日
    浏览(87)
  • 学习记录: requests 不同请求方式传参和常用的方法

    requests.Request(url) 构造一个请求,支持以下各种方式 requests.get() 发送get请求 requests.post() 发送post请求 requests.head() 获取HTML的头部信息 requests.put() 发送put请求 requests.patch() 提交局部修改的请求 requests.delete() 提交删除请求 语法构造 requests.get(url,params=None) 参数说明 url:需要爬取的

    2024年02月09日
    浏览(41)
  • HTTP请求响应详解 (HTTP请求数据格式,常见请求方式,后端响应参数)及Apifox(postman)使用方式

    目录 一.HTTP协议  二.HTTP请求数据格式  请求方式 三.后端响应请求 基于SpringBoot响应数据 请求响应的参数类型 同一响应格式 四.Apifox(postman)使用方法 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。 HTTP的特点和工作原理如下

    2024年03月09日
    浏览(69)
  • hutool Http 工具发送POST请求的几种方式。

    Hutool是一个Java工具库,提供了丰富的功能模块,包括HTTP请求发送。以下是使用Hutool发送POST请求的几种方式: 使用HttpUtil.post方法: 使用HttpUtil.post方法可以发送简单的POST请求,示例如下: 使用HttpUtil.createPost方法: 使用HttpUtil.createPost方法可以创建一个HttpPost对象,然后设置

    2024年02月13日
    浏览(37)
  • hutool Http 工具发送POST请求的几种方式

            目录 依赖 🍊Maven 🍐Gradle 实践 hutool源码 hutool调用实践 其它自定义项         本质上,HttpUtil中的get和post工具方法都是HttpRequest对象的封装,因此如果想更加灵活操作Http请求,可以使用HttpRequest。今天咱们就列举一下hutool工具中常用的几种发送post请求的方式。

    2024年02月08日
    浏览(55)
  • java通过okhttp方式实现https请求的工具类(绕过证书验证)

    引入相关依赖包 2.1、跳过证书配置类 跳过证书配置类代码 2.2、okhttp方式的 https工具类 okhttp方式的 https工具类代码 测试代码 测试输出结果

    2024年01月23日
    浏览(93)
  • Springboot -- 用更优雅的方式发HTTP请求(RestTemplate详解)

    RestTemplate 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是用apache的HttpClient开发,代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,稍微截个图,这是我封装好的一

    2024年02月02日
    浏览(40)
  • 【Java 进阶篇】Java Request 获取请求参数的通用方式详解

    在Java Web开发中,获取HTTP请求的参数是一项基本任务。请求参数可以包含在URL中,也可以包含在请求体中,例如表单提交时的参数。在Java中,可以使用 HttpServletRequest 对象来获取HTTP请求的参数。本文将详细解释如何使用Java获取HTTP请求的参数,包括通用的方式以及示例代码。

    2024年02月05日
    浏览(43)
  • 【API接口工具】postman-请求响应使用详解

    Postman 可以轻松创建和发送 API 请求。向端点发送请求、从数据源检索数据或测试 API 的功能。您无需在终端中输入命令或编写任何代码。创建一个新请求并选择Send,API 响应出现在 Postman 中。 定义的 API 请求 API 为一个应用程序访问另一个应用程序的功能提供了一种结构化的方

    2024年02月03日
    浏览(73)
  • python接口自动化(十)--post请求四种传送正文方式(详解)

    post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四种编码方式: HTTP 协议规定 POST 提交的数据必须放在消息主体(e

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包