HttpClient实现远程调用
作者:陈虎_63
这篇文章主要为大家详细介绍了HttpClient实现远程调用的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。