<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了HttpClient實現遠端呼叫的具體程式碼,供大家參考,具體內容如下
依賴:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.5</version> </dependency>
服務提供者:
/** * get請求 */ @GetMapping("/gte3") public AjaxResult getGuke3(Integer id) throws Exception { System.err.println("id:" + id); Uesr uesr = new Uesr(); uesr.setId(11); uesr.setName("chen"); return AjaxResult.success(uesr); } /** *post請求 */ @PostMapping("/test001") public AjaxResult post1(@RequestBody Uesr uesr) { System.err.println(uesr.getId() + uesr.getName()); return AjaxResult.success(1); } /** * 檔案上傳 */ @PostMapping("/test14") public AjaxResult test14(MultipartFile multipartFile, String id, String fileMd5) throws IOException { System.err.println(id); System.err.println(fileMd5); final InputStream inputStream = multipartFile.getInputStream(); int i = 0; while ((i = inputStream.read()) != -1) { char c = (char) i; System.err.println(c); } return AjaxResult.success(1); }
封裝的工具類:
package cn.sotos; import cn.sotos.util.AjaxResult; import cn.sotos.util.Uesr; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.ParseException; import org.apache.http.client.methods.*; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @program: exportool * @description: * @author: hu.chen **/ public class HttpClientHelper { private static CloseableHttpClient httpClient = HttpClientBuilder.create().build(); public static void main(String[] args) throws Exception { HttpClientHelper httpClientHelper = new HttpClientHelper(); //get請求 Map<String, Object> mapget = new ConcurrentHashMap<>(); mapget.put("id", 1); AjaxResult<Uesr> resultGet = httpClientHelper.doGet("http://127.0.0.1:8081/gte3", mapget, null, Uesr.class); System.err.println(resultGet.getCode()); System.err.println(resultGet.getMsg()); final Uesr uesr = resultGet.getData(); System.err.println(uesr.getName()); //post請求 Map<String, Object> mappost = new ConcurrentHashMap<>(); mappost.put("id", 2); mappost.put("name", "陳虎001post"); Uesr uesr1 = new Uesr(); uesr1.setName("chenpost"); uesr1.setId(001); AjaxResult<Integer> resultPost = httpClientHelper.doPost("http://127.0.0.1:8081/test001", uesr1, null, Integer.class); System.err.println(resultPost.getCode()); System.err.println(resultPost.getMsg()); final Integer nteger = resultPost.getData(); System.err.println(nteger); //檔案請求 List<File> files = new ArrayList<>(); File file = new File("D:/t.txt"); files.add(file); Map<String, String> mapfile = new ConcurrentHashMap<>(); mappost.put("id", " 2"); mappost.put("fileMd5", "陳虎001file"); AjaxResult<Integer> resultFile = httpClientHelper.updataFile("http://127.0.0.1:8081/test14", "multipartFile", files, mapfile, Integer.class); final Integer ntegerfile = resultFile.getData(); System.err.println(ntegerfile); } /** * 帶引數的get請求 * * @param url 請求地址 * @param parameValues 引數 * @param headerValues 請求頭引數 * @param clazz 返回引數型別 * @return * @throws Exception */ public <T> AjaxResult doGet(String url, Map<String, Object> parameValues, Map<String, String> headerValues, Class<T> clazz) throws Exception { // 宣告URIBuilder URIBuilder uriBuilder = new URIBuilder(url); // 判斷引數map是否為非空 if (parameValues != null) { // 遍歷引數 for (Map.Entry<String, Object> entry : parameValues.entrySet()) { // 設定引數 uriBuilder.setParameter(entry.getKey(), entry.getValue().toString()); } } // 2 建立httpGet物件,相當於設定url請求地址 HttpGet httpGet = new HttpGet(uriBuilder.build()); /* * 新增請求頭資訊 */ //判斷請求頭是否不為空 if (headerValues != null) { for (Map.Entry<String, String> entry : headerValues.entrySet()) { httpGet.addHeader(entry.getKey(), entry.getValue()); } } // 傳輸的型別 httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded"); // 3 使用HttpClient執行httpGet,相當於按回車,發起請求 CloseableHttpResponse response = httpClient.execute(httpGet); // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果 return pasResponse(response, clazz); } /** * 帶引數的post請求 * * @param url 請求地址 * @param parameter 引數 * @param headerValues 請求頭引數 * @param clazz 返回引數型別 * @return * @throws Exception */ public <T> AjaxResult doPost(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception { // 宣告httpPost請求 HttpPost httpPost = new HttpPost(url); setParam(httpPost, parameter, headerValues); // 傳輸的型別 httpPost.addHeader("Content-Type", "application/json; charset=UTF-8"); // 使用HttpClient發起請求,返回response CloseableHttpResponse response = httpClient.execute(httpPost); // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果 return pasResponse(response, clazz); } /** * 帶引數的Put請求 * * @param url 請求地址 * @param parameter 引數 * @param headerValues 請求頭引數 * @param clazz 返回引數型別 * @return * @throws Exception */ public <T> AjaxResult doPut(String url, Object parameter, Map<String, String> headerValues, Class<T> clazz) throws Exception { // 宣告httpPost請求 HttpPut httpPut = new HttpPut(url); setParam(httpPut, parameter, headerValues); // 傳輸的型別 httpPut.addHeader("Content-Type", "application/json; charset=UTF-8"); // 使用HttpClient發起請求,返回response CloseableHttpResponse response = httpClient.execute(httpPut); // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果 return pasResponse(response, clazz); } /** * 遠端呼叫傳輸檔案 * * @param url 請求地址 * @param fileKey 後端接收的檔案引數的名稱 * @param files 檔案集合 * @param parameValues 其他引數 * @param clazz 返回引數型別 */ public <T> AjaxResult updataFile(String url, String fileKey, List<File> files, Map<String, String> parameValues, Class<T> clazz) throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response = null; MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); //設定檔案引數 for (File file : files) { multipartEntityBuilder.addBinaryBody(fileKey, file, ContentType.DEFAULT_BINARY, URLEncoder.encode(file.getName(), "utf-8")); } //設定其他引數 if (parameValues != null) { // 其它引數(注:自定義contentType,設定UTF-8是為了防止伺服器端拿到的引數出現亂碼) ContentType contentType = ContentType.create("application/json", Charset.forName("UTF-8")); for (Map.Entry<String, String> entry : parameValues.entrySet()) { multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), contentType); } } HttpEntity httpEntity = multipartEntityBuilder.build(); httpPost.setEntity(httpEntity); response = httpClient.execute(httpPost); // 4 解析結果,封裝返回物件httpResult,相當於顯示相應的結果 return pasResponse(response, clazz); } /** * 設定引數 * * @param parameter 請求引數 * @param headerValues 請求頭引數 */ private void setParam(HttpEntityEnclosingRequestBase requestBase, Object parameter, Map<String, String> headerValues) { // 判斷引數是否不為空 if (parameter != null) { // 在傳送複雜巢狀物件時,一定要把物件轉成json字串,我這裡實用的是alibaba.fastjson,當然你也可以使用其他的json工具 StringEntity requestEntity = new StringEntity(JSON.toJSONString(parameter), "utf-8"); requestEntity.setContentEncoding("UTF-8"); requestBase.setEntity(requestEntity); } //判斷請求頭是否不為空 if (headerValues != null) { for (Map.Entry<String, String> entry : headerValues.entrySet()) { requestBase.addHeader(entry.getKey(), entry.getValue()); } } } /** * 封裝返回結果 * * @param response 資料集 * @param clazz 引數型別 * @param <T> * @return * @throws IOException */ private <T> AjaxResult pasResponse(CloseableHttpResponse response, Class<T> clazz) throws IOException { AjaxResult<T> ajaxResult = null; try { // 解析資料封裝HttpResult if (response.getEntity() != null) { ajaxResult = JSONObject.parseObject(EntityUtils.toString(response.getEntity(), "utf-8"), AjaxResult.class); ajaxResult.setData(JSONObject.parseObject(JSONObject.toJSONString(ajaxResult.getData()), clazz)); } else { ajaxResult = new AjaxResult(); } } catch (ParseException | IOException e) { System.err.println("返回結果轉換失敗" + e); } finally { try { // 釋放資源 if (response != null) { response.close(); } } catch (IOException e) { System.err.println("資源釋放失敗" + e); } } return ajaxResult; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45