HttpClient只能以编程的方式通过其API用于传输和接受HTTP消息。主要实现功能:
实现了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
支持 HTTPS 协议
支持代理服务器(Nginx等)等
支持自动(跳转)转向。
请求端:16-spt-http-request-demo :7000 响应端:16-spt-httppush-demo :8082

- <!-- httpclient -->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.5</version>
- </dependency>
- <!-- fastjson -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.47</version>
- </dependency>
注:SpringBoot的基本依赖配置,这里就不再多说了
1.消费者
- @RestController
- public class HttpClientController {
- @RequestMapping("/hc/api")
- public String getInfo() throws Exception {
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- // 创建Get请求
- HttpGet httpGet = new HttpGet("http://localhost:8082/get/noparam");
- String result="";
- // 响应模型
- CloseableHttpResponse response = null;
- try {
- // 由客户端执行(发送)Get请求
- response = httpClient.execute(httpGet);
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
-
-
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- }
2.服务者
- @RestController
- public class HttpClientController {
- @RequestMapping("/get/noparam")
- public String doGetNoParam(){
- return "ok 123!";
- }
- }
截图如下:

3.请求测试


1.消费者
- @RequestMapping("/hc/get/youcan")
- public String youcanOne() {
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- // 参数
- StringBuffer params = new StringBuffer();
- try {
- // 字符数据最好encoding以下;这样一来,某些特殊字符才能传过去(如:某人的名字就是“&”,不encoding的话,传不过去)
- params.append("name=" + URLEncoder.encode("zhangsan", "utf-8"));
- params.append("&");
- params.append("age=24");
- } catch (UnsupportedEncodingException e1) {
- e1.printStackTrace();
- }
-
- // 创建Get请求
- HttpGet httpGet = new HttpGet("http://localhost:8082/get/youparam1" + "?" + params);
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 配置信息
- RequestConfig requestConfig = RequestConfig.custom()
- // 设置连接超时时间(单位毫秒)
- .setConnectTimeout(5000)
- // 设置请求超时时间(单位毫秒)
- .setConnectionRequestTimeout(5000)
- // socket读写超时时间(单位毫秒)
- .setSocketTimeout(5000)
- // 设置是否允许重定向(默认为true)
- .setRedirectsEnabled(true).build();
-
- // 将上面的配置信息 运用到这个Get请求里
- httpGet.setConfig(requestConfig);
-
- // 由客户端执行(发送)Get请求
- response = httpClient.execute(httpGet);
-
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.提供者
- @RequestMapping("/get/youparam1")
- public String doGetYouParam(String name,Integer age){
-
- return "原来"+name+"都"+age+"岁";
- }
3.调用


1.消费者
- @RequestMapping("/hc/get/youcan2")
- public String yooucan2() {
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- // 参数
- URI uri = null;
- try {
- // 将参数放入键值对类NameValuePair中,再放入集合中
- List<NameValuePair> params = new ArrayList<>();
- params.add(new BasicNameValuePair("name", "lisi"));
- params.add(new BasicNameValuePair("age", "18"));
- // 设置uri信息,并将参数集合放入uri;
- // 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
- uri = new URIBuilder().setScheme("http").setHost("localhost")
- .setPort(8082).setPath("/get/youparam2")
- .setParameters(params).build();
- } catch (URISyntaxException e1) {
- e1.printStackTrace();
- }
- // 创建Get请求
- HttpGet httpGet = new HttpGet(uri);
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 配置信息
- RequestConfig requestConfig = RequestConfig.custom()
- // 设置连接超时时间(单位毫秒)
- .setConnectTimeout(5000)
- // 设置请求超时时间(单位毫秒)
- .setConnectionRequestTimeout(5000)
- // socket读写超时时间(单位毫秒)
- .setSocketTimeout(5000)
- // 设置是否允许重定向(默认为true)
- .setRedirectsEnabled(true).build();
-
- // 将上面的配置信息 运用到这个Get请求里
- httpGet.setConfig(requestConfig);
-
- // 由客户端执行(发送)Get请求
- response = httpClient.execute(httpGet);
-
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.提供者
- @RequestMapping("/get/youparam2")
- public String doGetYouParam2(String name,Integer age){
-
- return "原来"+name+"都"+age+"岁";
- }
3.调试

1.生产者
- @RequestMapping("/hc/post/wucan")
- public String doPostTestOne() {
-
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- // 创建Post请求
- HttpPost httpPost = new HttpPost("http://localhost:8082/post/noparam");
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 由客户端执行(发送)Post请求
- response = httpClient.execute(httpPost);
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
-
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.消费者
- @RequestMapping("/post/noparam")
- public String doPostNoParam(){
- return "post 请求无参数 123!";
- }
3.调用

1.消费者
- @RequestMapping("/hc/post/youcan1")
- public String doPostTestFour() {
-
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-
- // 参数
- StringBuffer params = new StringBuffer();
- try {
- // 字符数据最好encoding以下;这样一来,某些特殊字符才能传过去(如:某人的名字就是“&”,不encoding的话,传不过去)
- params.append("name=" + URLEncoder.encode("zhangsan", "utf-8"));
- params.append("&");
- params.append("age=24");
- } catch (UnsupportedEncodingException e1) {
- e1.printStackTrace();
- }
-
- // 创建Post请求
- HttpPost httpPost = new HttpPost("http://localhost:8082//post/youparam1" + "?" + params);
-
- // 设置ContentType(注:如果只是传普通参数的话,ContentType不一定非要用application/json)
- httpPost.setHeader("Content-Type", "application/json;charset=utf8");
-
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 由客户端执行(发送)Post请求
- response = httpClient.execute(httpPost);
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
-
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.消费者
- @RequestMapping(value="/post/youparam1",method = RequestMethod.POST)
- public String doPostYouParam(String name,Integer age){
-
- return "原来"+name+"都"+age+"岁";
- }
3.调用

1.消费者
- @RequestMapping("/hc/post/youcan2")
- public String doPostTestTwo() {
-
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-
- // 创建Post请求
- HttpPost httpPost = new HttpPost("http://localhost:8082/post/youparam2");
- User user = new User();
- user.setName("潘晓婷");
- user.setAge(18);
- user.setGender("女");
- user.setMotto("姿势要优雅~");
- // 我这里利用阿里的fastjson,将Object转换为json字符串;
- // (需要导入com.alibaba.fastjson.JSON包)
- String jsonString = JSON.toJSONString(user);
-
- StringEntity entity = new StringEntity(jsonString, "UTF-8");
-
- // post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
- httpPost.setEntity(entity);
-
- httpPost.setHeader("Content-Type", "application/json;charset=utf8");
-
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 由客户端执行(发送)Post请求
- response = httpClient.execute(httpPost);
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
-
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.请求者
- @RequestMapping(value="/post/youparam2",method = RequestMethod.POST)
- public String doPostYouParam(@RequestBody User u){
- return u.toString();
- }
3.调用

1.消费者
- @RequestMapping("/hc/post/youcan3")
- public String doPostTestThree() {
- // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-
- // 创建Post请求
- // 参数
- URI uri = null;
- try {
- // 将参数放入键值对类NameValuePair中,再放入集合中
- List<NameValuePair> params = new ArrayList<>();
- params.add(new BasicNameValuePair("flag", "4"));
- params.add(new BasicNameValuePair("meaning", "这是什么鬼?"));
- // 设置uri信息,并将参数集合放入uri;
- // 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
- uri = new URIBuilder().setScheme("http").setHost("localhost").setPort(8082)
- .setPath("/post/youparam3").setParameters(params).build();
- } catch (URISyntaxException e1) {
- e1.printStackTrace();
- }
-
- HttpPost httpPost = new HttpPost(uri);
- // HttpPost httpPost = new
- // HttpPost("http://localhost:12345/doPostControllerThree1");
-
- // 创建user参数
- User user = new User();
- user.setName("潘晓婷");
- user.setAge(18);
- user.setGender("女");
- user.setMotto("姿势要优雅~");
-
- // 将user对象转换为json字符串,并放入entity中
- StringEntity entity = new StringEntity(JSON.toJSONString(user), "UTF-8");
-
- // post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
- httpPost.setEntity(entity);
-
- httpPost.setHeader("Content-Type", "application/json;charset=utf8");
-
- // 响应模型
- CloseableHttpResponse response = null;
- String result="";
- try {
- // 由客户端执行(发送)Post请求
- response = httpClient.execute(httpPost);
- // 从响应模型中获取响应实体
- HttpEntity responseEntity = response.getEntity();
-
- System.out.println("响应状态为:" + response.getStatusLine());
- if (responseEntity != null) {
- System.out.println("响应内容长度为:" + responseEntity.getContentLength());
- result=EntityUtils.toString(responseEntity);
- System.out.println("响应内容为:" + result);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 释放资源
- if (httpClient != null) {
- httpClient.close();
- }
- if (response != null) {
- response.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
2.生产者
- @RequestMapping(value="/post/youparam3",method = RequestMethod.POST)
- public String doPostYouParam(@RequestBody User u,Integer flag,String meaning){
- return u.toString()+" flag:"+flag+" meaning:"+meaning;
- }
3.调用
