Java-Http Get,Post 案例

2019年12月02日 19:44 · 阅读(403) ·

目标

使用 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-添加接口地址

  1. # 调用外部接口地址
  2. external-interface:
  3. # 获取供应商接口地址
  4. supplier-url: http://1.1.1.1/SMS/Rest/VendorService/Get/GetVendorListById/

接口配置类

  1. package com.foreign.payment.config;
  2. import lombok.Getter;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.boot.context.properties.ConfigurationProperties;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * 调用第三方接口相关地址配置帮助类
  8. *
  9. * @author: v_hwhao
  10. * @date: 2019-11-29 10:10
  11. */
  12. @Component
  13. @ConfigurationProperties("external-interface")
  14. @Getter
  15. public class ExternalInterfaceConfig {
  16. /**
  17. * 获取供应商接口地址
  18. */
  19. @Value("${external-interface.supplier-url}")
  20. private String supplierUrl;
  21. }

接口数据类型

接口对应数据类

  1. package com.foreign.payment.vo;
  2. import lombok.Data;
  3. import java.util.List;
  4. /**
  5. * 供应商接口返回数据类
  6. * 注意:
  7. * 1.这里只取了接口中的本系统需要使用的字段
  8. * 2.大小写问题
  9. *
  10. * @author: v_hwhao
  11. * @date: 2019-11-28 20:14
  12. */
  13. @Data
  14. public class SupplierVO {
  15. private SupplierResult Result;
  16. }
  1. package com.foreign.payment.vo;
  2. import lombok.Data;
  3. /**
  4. * @author: v_hwhao
  5. * @date: 2019-11-29 18:32
  6. */
  7. @Data
  8. public class SupplierResult {
  9. /**
  10. * 请求 ID
  11. */
  12. private String RequestId;
  13. /**
  14. * 是否报错
  15. */
  16. private Boolean HasError;
  17. /**
  18. * 数据列表
  19. */
  20. private SupplierItems ResponseItems;
  21. }
  1. package com.foreign.payment.vo;
  2. import lombok.Data;
  3. import java.util.List;
  4. /**
  5. * @author: v_hwhao
  6. * @date: 2019-11-29 18:33
  7. */
  8. @Data
  9. public class SupplierItems {
  10. private List<SupplierRecords> RECORDS;
  11. }
  1. package com.foreign.payment.vo;
  2. import lombok.Data;
  3. /**
  4. * @author: v_hwhao
  5. * @date: 2019-11-29 18:34
  6. */
  7. @Data
  8. public class SupplierRecords {
  9. /**
  10. * 供应商ID
  11. */
  12. private Integer SupplierId;
  13. /**
  14. * 供应商名称,纳税人名称
  15. */
  16. private String SupplierName;
  17. /**
  18. * 国标行业(取接口中的"供应商服务范围"字段)
  19. */
  20. private String VendorServiceArea;
  21. /**
  22. * 国别(取接口中的"国家代码"字段)
  23. */
  24. private String CountryCode;
  25. /**
  26. * 非居民名称(大写)-(根据供应商名称字段拼音全部大写)
  27. */
  28. private String NonResidentName;
  29. /**
  30. * 英文注册地址(大写)- 为中文的情况不管,原样显示
  31. */
  32. private String RegesterAddress;
  33. /**
  34. * 法人/负责人(取接口中的"法定代表人"字段)
  35. */
  36. private String LegalRepresentative;
  37. /**
  38. * 证件号(取接口中的"法定代表人证件号"字段)
  39. */
  40. private String CertificateNumber;
  41. /**
  42. * 证件类型(取接口中的"法定代表人证件类型"字段)
  43. */
  44. private String CertificateType;
  45. }

公共类-WebClientUtils

  1. package com.foreign.payment.common.util;
  2. import cn.hutool.http.HttpRequest;
  3. import cn.hutool.http.HttpResponse;
  4. import com.alibaba.fastjson.JSON;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.net.URLEncoder;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * WebClient 工具类
  11. *
  12. * @author: v_hwhao
  13. * @date: 2019-11-29 14:28
  14. */
  15. @Slf4j
  16. public class WebClientUtils{
  17. /**
  18. * 获取 http 调用 header 参数
  19. * @return header
  20. */
  21. private static Map<String,String> getHeader(){
  22. Map<String,String> headers = new HashMap<>();
  23. headers.put("Content-Type","application/json;charset=utf-8");
  24. return headers;
  25. }
  26. /**
  27. * 通过 get 方式调用 url
  28. * @param url url
  29. * @param urlParam url 参数,这里不放在 url 里面的原因是需要编码,否则找不到数据
  30. * @return 接口返回的信息
  31. */
  32. public static String get(String url,Map<String,String> urlParam){
  33. String paramStr="";
  34. try{
  35. Integer i = 0;
  36. for (Map.Entry<String,String> item : urlParam.entrySet()){
  37. if(i == 0){
  38. paramStr += "?"+item.getKey()+"="+ URLEncoder.encode(item.getValue(),"UTF-8" );
  39. }else{
  40. paramStr +="&"+item.getKey()+"="+ URLEncoder.encode(item.getValue(),"UTF-8" );
  41. }
  42. i++;
  43. }
  44. //记录请求接口前日志
  45. String reqLogMsg = String.format("[通过 get 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,paramStr);
  46. log.info(reqLogMsg);
  47. HttpRequest request = HttpRequest.get(url + paramStr);
  48. HttpResponse response = request.execute();
  49. String requestResult = response.body();
  50. //记录响应后日志
  51. String repLogMsg = String.format("[通过 get 方式请求外部接口-结束请求]请求地址:%s;请求参数:%s;响应结果:%s。", url,paramStr,requestResult);
  52. log.info(repLogMsg);
  53. return requestResult;
  54. //T data = JSON.parseObject(requestResult, new Class<T>());
  55. //return data;
  56. }catch (Exception ex){
  57. String errorMsg = String.format("[通过 get 方式请求外部接口-请求异常]请求地址:%s;请求参数:%s;异常信息:%s。", url, paramStr,ex.getMessage());
  58. log.error(errorMsg);
  59. return errorMsg;
  60. }
  61. }
  62. /**
  63. * 通过 post 方式调用 url
  64. * @param url url
  65. * @param params 接口参数
  66. * @return 接口返回的信息
  67. */
  68. public static String post(String url, Object params){
  69. try{
  70. String data = JSON.toJSONString(params);
  71. //记录请求接口前日志
  72. String reqLogMsg = String.format("[通过 post 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,data);
  73. log.info(reqLogMsg);
  74. HttpRequest request = HttpRequest.post(url).addHeaders(getHeader()).body(data);
  75. HttpResponse response = request.execute();
  76. String requestResult = response.body();
  77. //记录响应后日志
  78. String repLogMsg = String.format("[通过 post 方式请求外部接口-结束请求]响应结果:%s。", requestResult);
  79. log.info(repLogMsg);
  80. return requestResult;
  81. //T data = JSON.parseObject(requestResult, new Class<T>());
  82. //return data;
  83. }catch (Exception ex){
  84. String errorMsg = String.format("[通过 post 方式请求外部接口-请求异常]异常信息:%s。", ex.getMessage());
  85. log.error(errorMsg);
  86. return errorMsg;
  87. }
  88. }
  89. /**
  90. * 通过 post 方式调用 url
  91. * @param url url
  92. * @param header header 参数
  93. * @param params 接口参数
  94. * @return 接口返回的信息
  95. */
  96. public static String post(String url,Map<String,String> header, String data,String contentType){
  97. try{
  98. //String data = JSON.toJSONString(params);
  99. if(contentType == ""){
  100. contentType="application/json;charset=utf-8";
  101. }
  102. //记录请求接口前日志
  103. String reqLogMsg = String.format("[通过 post 方式请求外部接口-开始请求]请求地址:%s;请求参数:%s。", url,data);
  104. log.info(reqLogMsg);
  105. HttpRequest request = HttpRequest.post(url).contentType(contentType).addHeaders(header).body(data);
  106. HttpResponse response = request.execute();
  107. String requestResult = response.body();
  108. //记录响应后日志
  109. String repLogMsg = String.format("[通过 post 方式请求外部接口-结束请求]响应结果:%s。", requestResult);
  110. log.info(repLogMsg);
  111. return requestResult;
  112. //T data = JSON.parseObject(requestResult, new Class<T>());
  113. //return data;
  114. }catch (Exception ex){
  115. String errorMsg = String.format("[通过 post 方式请求外部接口-请求异常]异常信息:%s。", url,ex.getMessage());
  116. log.error(errorMsg);
  117. return errorMsg;
  118. }
  119. }
  120. }

接口类

  1. package com.foreign.payment.control;
  2. import com.foreign.payment.config.ExternalInterfaceConfig;
  3. import com.foreign.payment.data.SupplierRequestData;
  4. import com.foreign.payment.enums.ResponseCode;
  5. import com.foreign.payment.util.CharacterPinYinConvert;
  6. import com.foreign.payment.util.GsonUtils;
  7. import com.foreign.payment.util.WebClientUtils;
  8. import com.foreign.payment.vo.ResponseVO;
  9. import com.foreign.payment.vo.SupplierRecords;
  10. import com.foreign.payment.vo.SupplierVO;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.web.bind.annotation.PostMapping;
  14. import org.springframework.web.bind.annotation.RequestBody;
  15. import org.springframework.web.bind.annotation.RestController;
  16. import javax.annotation.Resource;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. /**
  21. * 供应商接口
  22. *
  23. * @author: v_hwhao
  24. * @date: 2019-11-28 17:47
  25. */
  26. @Slf4j
  27. @RestController
  28. public class SupplierController {
  29. /**
  30. * 调用第三方接口相关地址配置帮助类
  31. */
  32. @Resource
  33. private ExternalInterfaceConfig config;
  34. /**
  35. * 查询供应商
  36. *
  37. * @param param 供应商ID或名称
  38. * @return 供应商接口数据
  39. */
  40. @PostMapping("/GetSupplier")
  41. public ResponseVO GetSupplier(@RequestBody SupplierRequestData param){
  42. ResponseVO<SupplierVO> responseVO = new ResponseVO<SupplierVO>();
  43. if(StringUtils.isBlank(param.getSupplierId()) && StringUtils.isBlank(param.getSupplierName())){
  44. responseVO.setCode(ResponseCode.PARAM_INVALID.value());
  45. responseVO.setMessage(ResponseCode.PARAM_INVALID.getDescription());
  46. return responseVO;
  47. }
  48. try{
  49. //示例数据:?SupplierId=42678&SupplierName=蚂蚁科技
  50. String url = config.getSupplierUrl();
  51. Map<String,String> urlParam = new HashMap<>();
  52. urlParam.put("SupplierId",param.getSupplierId());
  53. urlParam.put("SupplierName", param.getSupplierName());
  54. String jsonResult = WebClientUtils.get(url,urlParam);
  55. SupplierVO data = GsonUtils.fromJson(jsonResult,SupplierVO.class);
  56. //非居民名称(大写)-(根据供应商名称字段拼音全部大写)
  57. if(data != null
  58. && data.getResult() != null
  59. && data.getResult().getResponseItems() != null
  60. && data.getResult().getResponseItems().getRECORDS() != null
  61. && data.getResult().getResponseItems().getRECORDS().size() > 0
  62. ){
  63. CharacterPinYinConvert convertPinYin = new CharacterPinYinConvert();
  64. List<SupplierRecords> listData = data.getResult().getResponseItems().getRECORDS();
  65. for(int i=0;i<listData.size();i++){
  66. //供应商名称
  67. String supplierName = listData.get(i).getSupplierName();
  68. //非居民名称(大写)-根据供应商名称全部大写
  69. String nonResidentName = convertPinYin.toPinYin(supplierName);
  70. listData.get(i).setNonResidentName(nonResidentName);
  71. }
  72. data.getResult().getResponseItems().setRECORDS(listData);
  73. }
  74. responseVO.setCode(ResponseCode.OK.value());
  75. responseVO.setMessage(ResponseCode.OK.getDescription());
  76. responseVO.setData(data);
  77. }catch (Exception ex){
  78. String errorMsg = "service-查询供应商异常-异常信息-"+ex.getMessage();
  79. log.error(errorMsg);
  80. responseVO.setCode(ResponseCode.SYSTEM_EXCEPTION.value());
  81. responseVO.setMessage(errorMsg);
  82. }
  83. return responseVO;
  84. }
  85. }

测试

扩展-汉字转拼音

Java-汉字转拼音