目标
使用 Java 模拟 Http Get,Post 请求
开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | Windows 10 X64 |
| JDK | JDK1.8(jdk-8u151-windows-x64) |
| IntelliJ IDEA | IntelliJ IDEA 2018.3 |
| Maven | Maven 3.6.0 |
说明
本文代码在 IntelliJ IDEA 2018.3 创建 Maven 多模块(Module)项目+负载均衡 项目上进行添加操作,不过也可独立出来看。
接口相关公共类
application.yml-添加接口地址
# 调用外部接口地址external-interface:# 获取供应商接口地址supplier-url: http://1.1.1.1/SMS/Rest/VendorService/Get/GetVendorListById/
接口配置类
package com.foreign.payment.config;import lombok.Getter;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/*** 调用第三方接口相关地址配置帮助类** @author: v_hwhao* @date: 2019-11-29 10:10*/@Component@ConfigurationProperties("external-interface")@Getterpublic class ExternalInterfaceConfig {/*** 获取供应商接口地址*/@Value("${external-interface.supplier-url}")private String supplierUrl;}
接口数据类型

接口对应数据类
package com.foreign.payment.vo;import lombok.Data;import java.util.List;/*** 供应商接口返回数据类* 注意:* 1.这里只取了接口中的本系统需要使用的字段* 2.大小写问题** @author: v_hwhao* @date: 2019-11-28 20:14*/@Datapublic class SupplierVO {private SupplierResult Result;}
package com.foreign.payment.vo;import lombok.Data;/*** @author: v_hwhao* @date: 2019-11-29 18:32*/@Datapublic class SupplierResult {/*** 请求 ID*/private String RequestId;/*** 是否报错*/private Boolean HasError;/*** 数据列表*/private SupplierItems ResponseItems;}
package com.foreign.payment.vo;import lombok.Data;import java.util.List;/*** @author: v_hwhao* @date: 2019-11-29 18:33*/@Datapublic class SupplierItems {private List<SupplierRecords> RECORDS;}
package com.foreign.payment.vo;import lombok.Data;/*** @author: v_hwhao* @date: 2019-11-29 18:34*/@Datapublic class SupplierRecords {/*** 供应商ID*/private Integer SupplierId;/*** 供应商名称,纳税人名称*/private String SupplierName;/*** 国标行业(取接口中的"供应商服务范围"字段)*/private String VendorServiceArea;/*** 国别(取接口中的"国家代码"字段)*/private String CountryCode;/*** 非居民名称(大写)-(根据供应商名称字段拼音全部大写)*/private String NonResidentName;/*** 英文注册地址(大写)- 为中文的情况不管,原样显示*/private String RegesterAddress;/*** 法人/负责人(取接口中的"法定代表人"字段)*/private String LegalRepresentative;/*** 证件号(取接口中的"法定代表人证件号"字段)*/private String CertificateNumber;/*** 证件类型(取接口中的"法定代表人证件类型"字段)*/private String CertificateType;}
公共类-WebClientUtils
package com.foreign.payment.common.util;import cn.hutool.http.HttpRequest;import cn.hutool.http.HttpResponse;import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;/*** WebClient 工具类** @author: v_hwhao* @date: 2019-11-29 14:28*/@Slf4jpublic class WebClientUtils{/*** 获取 http 调用 header 参数* @return header*/private static Map<String,String> getHeader(){Map<String,String> headers = new HashMap<>();headers.put("Content-Type","application/json;charset=utf-8");return headers;}/*** 通过 get 方式调用 url* @param url url* @param urlParam url 参数,这里不放在 url 里面的原因是需要编码,否则找不到数据* @return 接口返回的信息*/public static String get(String url,Map<String,String> urlParam){String paramStr="";try{Integer i = 0;for (Map.Entry<String,String> item : urlParam.entrySet()){if(i == 0){paramStr += "?"+item.getKey()+"="+ URLEncoder.encode(item.getValue(),"UTF-8" );}else{paramStr +="&"+item.getKey()+"="+ URLEncoder.encode(item.getValue(),"UTF-8" );}i++;}//记录请求接口前日志String reqLogMsg = String.format("[通过 get 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,paramStr);log.info(reqLogMsg);HttpRequest request = HttpRequest.get(url + paramStr);HttpResponse response = request.execute();String requestResult = response.body();//记录响应后日志String repLogMsg = String.format("[通过 get 方式请求外部接口-结束请求]请求地址:%s;请求参数:%s;响应结果:%s。", url,paramStr,requestResult);log.info(repLogMsg);return requestResult;//T data = JSON.parseObject(requestResult, new Class<T>());//return data;}catch (Exception ex){String errorMsg = String.format("[通过 get 方式请求外部接口-请求异常]请求地址:%s;请求参数:%s;异常信息:%s。", url, paramStr,ex.getMessage());log.error(errorMsg);return errorMsg;}}/*** 通过 post 方式调用 url* @param url url* @param params 接口参数* @return 接口返回的信息*/public static String post(String url, Object params){try{String data = JSON.toJSONString(params);//记录请求接口前日志String reqLogMsg = String.format("[通过 post 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,data);log.info(reqLogMsg);HttpRequest request = HttpRequest.post(url).addHeaders(getHeader()).body(data);HttpResponse response = request.execute();String requestResult = response.body();//记录响应后日志String repLogMsg = String.format("[通过 post 方式请求外部接口-结束请求]响应结果:%s。", requestResult);log.info(repLogMsg);return requestResult;//T data = JSON.parseObject(requestResult, new Class<T>());//return data;}catch (Exception ex){String errorMsg = String.format("[通过 post 方式请求外部接口-请求异常]异常信息:%s。", ex.getMessage());log.error(errorMsg);return errorMsg;}}/*** 通过 post 方式调用 url* @param url url* @param header header 参数* @param params 接口参数* @return 接口返回的信息*/public static String post(String url,Map<String,String> header, String data,String contentType){try{//String data = JSON.toJSONString(params);if(contentType == ""){contentType="application/json;charset=utf-8";}//记录请求接口前日志String reqLogMsg = String.format("[通过 post 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,data);log.info(reqLogMsg);HttpRequest request = HttpRequest.post(url).contentType(contentType).addHeaders(header).body(data);HttpResponse response = request.execute();String requestResult = response.body();//记录响应后日志String repLogMsg = String.format("[通过 post 方式请求外部接口-结束请求]响应结果:%s。", requestResult);log.info(repLogMsg);return requestResult;//T data = JSON.parseObject(requestResult, new Class<T>());//return data;}catch (Exception ex){String errorMsg = String.format("[通过 post 方式请求外部接口-请求异常]异常信息:%s。", url,ex.getMessage());log.error(errorMsg);return errorMsg;}}}
接口类
package com.foreign.payment.control;import com.foreign.payment.config.ExternalInterfaceConfig;import com.foreign.payment.data.SupplierRequestData;import com.foreign.payment.enums.ResponseCode;import com.foreign.payment.util.CharacterPinYinConvert;import com.foreign.payment.util.GsonUtils;import com.foreign.payment.util.WebClientUtils;import com.foreign.payment.vo.ResponseVO;import com.foreign.payment.vo.SupplierRecords;import com.foreign.payment.vo.SupplierVO;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;import java.util.HashMap;import java.util.List;import java.util.Map;/*** 供应商接口** @author: v_hwhao* @date: 2019-11-28 17:47*/@Slf4j@RestControllerpublic class SupplierController {/*** 调用第三方接口相关地址配置帮助类*/@Resourceprivate ExternalInterfaceConfig config;/*** 查询供应商** @param param 供应商ID或名称* @return 供应商接口数据*/@PostMapping("/GetSupplier")public ResponseVO GetSupplier(@RequestBody SupplierRequestData param){ResponseVO<SupplierVO> responseVO = new ResponseVO<SupplierVO>();if(StringUtils.isBlank(param.getSupplierId()) && StringUtils.isBlank(param.getSupplierName())){responseVO.setCode(ResponseCode.PARAM_INVALID.value());responseVO.setMessage(ResponseCode.PARAM_INVALID.getDescription());return responseVO;}try{//示例数据:?SupplierId=42678&SupplierName=蚂蚁科技String url = config.getSupplierUrl();Map<String,String> urlParam = new HashMap<>();urlParam.put("SupplierId",param.getSupplierId());urlParam.put("SupplierName", param.getSupplierName());String jsonResult = WebClientUtils.get(url,urlParam);SupplierVO data = GsonUtils.fromJson(jsonResult,SupplierVO.class);//非居民名称(大写)-(根据供应商名称字段拼音全部大写)if(data != null&& data.getResult() != null&& data.getResult().getResponseItems() != null&& data.getResult().getResponseItems().getRECORDS() != null&& data.getResult().getResponseItems().getRECORDS().size() > 0){CharacterPinYinConvert convertPinYin = new CharacterPinYinConvert();List<SupplierRecords> listData = data.getResult().getResponseItems().getRECORDS();for(int i=0;i<listData.size();i++){//供应商名称String supplierName = listData.get(i).getSupplierName();//非居民名称(大写)-根据供应商名称全部大写String nonResidentName = convertPinYin.toPinYin(supplierName);listData.get(i).setNonResidentName(nonResidentName);}data.getResult().getResponseItems().setRECORDS(listData);}responseVO.setCode(ResponseCode.OK.value());responseVO.setMessage(ResponseCode.OK.getDescription());responseVO.setData(data);}catch (Exception ex){String errorMsg = "service-查询供应商异常-异常信息-"+ex.getMessage();log.error(errorMsg);responseVO.setCode(ResponseCode.SYSTEM_EXCEPTION.value());responseVO.setMessage(errorMsg);}return responseVO;}}
测试
