SpringBoot釋出HttpClient服務和客戶端呼叫HttpClient服務
阿新 • • 發佈:2019-02-01
之前在做公司專案的一個功能需要寫WebSerice介面,寫完之後我們老大說也可以用HttpClient來寫介面,所以寫了一個介面例子。
新增依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wyj</groupId> <artifactId>wyj-interface-client</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>wyj-interface-client Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- http --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <!--webservice cxf --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.8</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.8</version> </dependency> </dependencies> <build> <finalName>wyj-interface-client</finalName> </build> </project>
HttpClient客戶端
可以傳輸json和map資料,可以使用get和post請求,詳情見備註
package http; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.junit.Test; import com.alibaba.fastjson.JSON; /** * http客戶端 * * * @author:WangYuanJun * @date:2017年12月20日 下午8:26:51 */ public class HttpClientTest { /** * post請求傳輸map資料 * * @param url * @param map * @param encoding * @return * @throws ClientProtocolException * @throws IOException */ public static String sendPostDataByMap(String url, Map<String, String> map, String encoding) throws ClientProtocolException, IOException { String result = ""; // 建立httpclient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); // 建立post方式請求物件 HttpPost httpPost = new HttpPost(url); // 裝填引數 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); if (map != null) { for (Entry<String, String> entry : map.entrySet()) { nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } // 設定引數到請求物件中 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding)); // 設定header資訊 // 指定報文頭【Content-type】、【User-Agent】 httpPost.setHeader("Content-type", "application/x-www-form-urlencoded"); httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 執行請求操作,並拿到結果(同步阻塞) CloseableHttpResponse response = httpClient.execute(httpPost); // 獲取結果實體 // 判斷網路連線狀態碼是否正常(0--200都數正常) if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { result = EntityUtils.toString(response.getEntity(), "utf-8"); } // 釋放連結 response.close(); return result; } /** * post請求傳輸json資料 * * @param url * @param json * @param encoding * @return * @throws ClientProtocolException * @throws IOException */ public static String sendPostDataByJson(String url, String json, String encoding) throws ClientProtocolException, IOException { String result = ""; // 建立httpclient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); // 建立post方式請求物件 HttpPost httpPost = new HttpPost(url); // 設定引數到請求物件中 StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON); stringEntity.setContentEncoding("utf-8"); httpPost.setEntity(stringEntity); // 執行請求操作,並拿到結果(同步阻塞) CloseableHttpResponse response = httpClient.execute(httpPost); // 獲取結果實體 // 判斷網路連線狀態碼是否正常(0--200都數正常) if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { result = EntityUtils.toString(response.getEntity(), "utf-8"); } // 釋放連結 response.close(); return result; } /** * get請求傳輸資料 * * @param url * @param encoding * @return * @throws ClientProtocolException * @throws IOException */ public String sendGetData(String url, String encoding) throws ClientProtocolException, IOException { String result = ""; // 建立httpclient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); // 建立get方式請求物件 HttpGet httpGet = new HttpGet(url); httpGet.addHeader("Content-type", "application/json"); // 通過請求物件獲取響應物件 CloseableHttpResponse response = httpClient.execute(httpGet); // 獲取結果實體 // 判斷網路連線狀態碼是否正常(0--200都數正常) if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { result = EntityUtils.toString(response.getEntity(), "utf-8"); } // 釋放連結 response.close(); return result; } @Test public void testSendPostDataByMap() throws ClientProtocolException, IOException { String url = "http://localhost:8080/httpService/sendPostDataByMap"; Map<String, String> map = new HashMap<String, String>(); map.put("name", "wyj"); map.put("city", "南京"); String body = sendPostDataByMap(url, map, "utf-8"); System.out.println("響應結果:" + body); } @Test public void testSendPostDataByJson() throws ClientProtocolException, IOException { String url = "http://localhost:8080/httpService/sendPostDataByJson"; Map<String, String> map = new HashMap<String, String>(); map.put("name", "wyj"); map.put("city", "南京"); String body = sendPostDataByJson(url, JSON.toJSONString(map), "utf-8"); System.out.println("響應結果:" + body); } @Test public void testSendGetData() throws ClientProtocolException, IOException { String url = "http://localhost:8080/httpService/sendGetData?name=wyj&city=南京"; String body = sendGetData(url, "utf-8"); System.out.println("響應結果:" + body); } }
HttpClient服務端
package com.wyj.http;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
* http服務端
*
*
* @author:WangYuanJun
* @date:2017年12月21日 下午8:27:08
*/
@RestController
@RequestMapping("/httpService")
public class HttpServiceTest {
@RequestMapping(value = "/sendPostDataByMap", method = RequestMethod.POST)
public String sendPostDataByMap(HttpServletRequest request, HttpServletResponse response) {
String result = "呼叫成功:資料是 " + "name:" + request.getParameter("name") + " city:" + request.getParameter("city");
return JSON.toJSONString(result);
}
@RequestMapping(value = "/sendPostDataByJson", method = RequestMethod.POST)
public String sendPostDataByJson(HttpServletRequest request, HttpServletResponse response, @RequestBody String requestBody) {
JSONObject jsonObject = JSONObject.parseObject(requestBody);
String result = "呼叫成功:資料是 " + "name:" + jsonObject.getString("name") + " city:" + jsonObject.getString("city");
return JSON.toJSONString(result);
}
@RequestMapping(value = "/sendGetData", method = RequestMethod.GET)
public String sendGetData(HttpServletRequest request, HttpServletResponse response) {
String result = "呼叫成功:資料是 " + "name:" + request.getParameter("name") + " city:" + request.getParameter("city");
return JSON.toJSONString(result);
}
}