读《http 权威指南后》,写的一个只有18K 大小的httpClient

本文分享了一个基于Java实现的简易HTTP客户端项目。该客户端支持GET、POST等方法,并能解析不同类型的HTTP响应报文。通过该项目,作者加深了对HTTP协议的理解。

     前端时间,读了《http 权威指南》后,对自己掌握的技能和理论去实现一个简单的http client,心里有点摇摇欲试。大概用了几个小时,就用java写了个简单的http client实现。

         目前对http get方法,post方法测试了,没啥问题(也支持http 其它方法)。对http response 报文的解析支持两种,一种是conten-length固定长度 body实体解析,一种是Transfer-Encoding body实体长度可变的解析。

Github 地址:https://github.com/jackliujithub/java-httpclient-18k

       总结:通过本次实现简单的http clien对http request 报文格式,response 报文格式进一步了解,对网络组包,拆包有了一定的提高

好的,以下是一个基于 Apache Commons Pool2 的 Http 连接池实现: 首先,我们需要定义一个 HttpClient 对象的工厂类 PooledHttpClientFactory,它实现了 PooledObjectFactory 接口,负责创建和销毁 HttpClient 对象: ```java import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObjectFactory; import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClients; public class PooledHttpClientFactory implements PooledObjectFactory<HttpClient> { @Override public PooledObject<HttpClient> makeObject() throws Exception { HttpClient httpClient = HttpClients.createDefault(); return new DefaultPooledObject<>(httpClient); } @Override public void destroyObject(PooledObject<HttpClient> pooledObject) throws Exception { HttpClient httpClient = pooledObject.getObject(); httpClient.close(); } @Override public boolean validateObject(PooledObject<HttpClient> pooledObject) { return true; } @Override public void activateObject(PooledObject<HttpClient> pooledObject) throws Exception { } @Override public void passivateObject(PooledObject<HttpClient> pooledObject) throws Exception { } } ``` 然后,我们使用 GenericObjectPool 来管理 HttpClient 对象的池: ```java import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.http.client.HttpClient; public class HttpClientPool { private GenericObjectPool<HttpClient> pool; public HttpClientPool() { PooledHttpClientFactory factory = new PooledHttpClientFactory(); this.pool = new GenericObjectPool<>(factory); } public HttpClient borrowHttpClient() throws Exception { return pool.borrowObject(); } public void returnHttpClient(HttpClient httpClient) { pool.returnObject(httpClient); } } ``` 现在,我们就可以使用 HttpClientPool 来获取 HttpClient 对象了: ```java import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; public class Main { public static void main(String[] args) throws Exception { HttpClientPool httpClientPool = new HttpClientPool(); try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { HttpUriRequest httpRequest = new HttpGet("https://www.baidu.com"); HttpContext httpContext = new BasicHttpContext(); httpContext.setAttribute("org.apache.http.client.protocol.HTTPCS", new BasicHeader("Connection", "close")); try (CloseableHttpResponse httpResponse = httpClient.execute(httpRequest, httpContext)) { String responseText = EntityUtils.toString(httpResponse.getEntity()); System.out.println(responseText); } } httpClientPool.returnHttpClient(httpClient); } } ``` 以上就是一个简单的 HttpClient 连接池实现,如果需要更高级的功能,可以参考 Apache HttpClient ConnectionManager 的实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值