目标
使用 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")
@Getter
public 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
*/
@Data
public class SupplierVO {
private SupplierResult Result;
}
package com.foreign.payment.vo;
import lombok.Data;
/**
* @author: v_hwhao
* @date: 2019-11-29 18:32
*/
@Data
public 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
*/
@Data
public class SupplierItems {
private List<SupplierRecords> RECORDS;
}
package com.foreign.payment.vo;
import lombok.Data;
/**
* @author: v_hwhao
* @date: 2019-11-29 18:34
*/
@Data
public 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
*/
@Slf4j
public 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
@RestController
public class SupplierController {
/**
* 调用第三方接口相关地址配置帮助类
*/
@Resource
private 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;
}
}