关注公众号,一起交流,微信搜一搜: 潜行前行
HttpClient (apache)
apache HttpClient 是 java项目里 较为常用的组件之一;对接外部服务时,各个商家提供的接口是各式各样的,有自己的要求,因此要定制对应的请求客户端。httpClient是一个不错的选择
- apache HttpClient 实现了 HTTP 1.0 和 HTTP 1.1。支持 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)
- GET, POST 的实现是继承 HttpRequestBase,HttpRequestBase 实现 HttpUriRequest,HttpUriRequest 继承 HttpRequest;GET, POST 方法对应 java 类的 HttpGet 和 HttpPost
- 支持 TLS,SSL 的 HTTPS。支持多线程操作
- 基于阻塞的 I/0 实现,也就是说使用 HttpClient 的线程会被阻塞
- 头部信息设置
1 | java复制代码HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/app"); |
- 证书信息设置
1 | java复制代码private static SSLContext getSslContext() throws Exception { |
- 缓存 cookie 设置
1 | java复制代码//自定义 cookie |
- RequestConfig 的使用
1 | java复制代码RequestConfig defaultRequestConfig = RequestConfig.custom() |
- HttpEntity 是对《请求或者响应》对象的封装,具体实现类有
- BasicHttpEntity,InputStreamEntity:操作对象是数据流
- BufferedHttpEntity:带缓冲区的 HttpEntity,其他HttpEntity的包装类,将内容存入一缓存区 可以重复读
- FileEntity:文件对应的Entity
FileEntity entity = new FileEntity(new File(""), "application/java-achive");
- StringEntity:字符串 Entity。一般用 json ,text/plain,text/xml 类型的post请求
- UrlEncodedFormEntity,一般用于 application/x-www-form-urlencoded 类型的post请求
- HttpContext:它是 Http 请求上下文类,如果是同一个上下文,则两次请求间可以共享这个上线文的信息。虽然 HttpClient 本身就具备维护cookies的功能,但 HttpContext 的好处是在于多个 HttpClient 实例之间可以共享 HttpContext
一些建议
- 1 释放资源:读取完响应后,我们需要尽快释放response本身和响应实体本身的流来对资源进行回收
- 2 有时可能需要多次读取返回的响应内容,将响应内容进行缓冲。最简单的方法是用BufferedHttpEntity 类包装原始实体。这会让原始实体的内容被读入内存缓冲区
1 | java复制代码CloseableHttpResponse response = ... |
- 3 HttpClient 的线程安全:使用同一个HttpClient的实例即可做到线程安全,因为 HttpClient 内部就有一个池化机制,支持多线程
- 4 EntityUtils.toString(entity) : 把内容转成字符串
CloseableHttpClient 是 HttpClient 的子类。mvn 引入
1 | mvn复制代码<dependency> |
HttpClient 的API
1 | java复制代码HttpResponse execute(HttpUriRequest request) |
get 请求
1 | java复制代码CloseableHttpClient httpclient = HttpClients.createDefault(); |
post 请求
1 | java复制代码CloseableHttpClient httpclient = HttpClients.createDefault(); |
文件上传
1 | java复制代码CloseableHttpClient httpClient = HttpClientBuilder.create().build(); |
HttpClient (jdk11)
java.net.http.HttpClient 是 jdk11 中正式启用的一个 http 工具类(在 jdk9 的时候就已经存在),官方想要取代 HttpURLConnection 和 Apache HttpClient 等比较古老的开发工具
HttpClient 的API
1 | java复制代码//创建一个 HttpClient |
- HttpClient.Builder 的 API
1 | java复制代码//缓存cookie设置 |
- HttpClient 调用 API
1 | java复制代码//阻塞调用 |
HttpRequest 构建的 API
对于请求内容可以使用 BodyPublishers 封装的函数生成
HttpResponse 的API
对于响应的解析读取可以使用 BodyHandlers 或者 BodySubscribers 封装的函数处理
get 请求
1 | java复制代码HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:8080/content/lwl")) |
post 请求
1 | java复制代码String data = .....// json 请求数据 |
欢迎指正文中错误
参考文章
本文转载自: 掘金