SpringBoot中调用第三方接口的三种方式

使用SpringBoot跨系统调用接口的方案

一、简介

项目开发中存在系统之间互调问题,又不想用dubbo,这里提供几种SpringBoot方案:

1、使用Feign进行消费(推荐)

2、使用原始httpClient请求

3、使用RestTemplate方法

二、方案

方案一:使用Feign进行消费(推荐)

1、在maven中添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.2</version>
</dependency>

2、启动类上加上@EnableFeignClients

@EnableHystrix
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.aaa.aurora"})
@SpringBootApplication
@EnableTransactionManagement
@ComponentScan(basePackages = "com.aaa.aurora")
@ImportResource(locations= {"classpath:spring.xml","spring-security.xml"})
@MapperScan("com.aaa.aurora.mapper")
public class AuroraWebApplication {public static void main(String[] args) {SpringApplication.run(AuroraWebApplication.class, args);}
}

3、编写service接口

@FeignClient(url = "${pangu.url}",name = "panguUrl")
public interface PanGuService {@RequestMapping(value = "/pangu/restful/check",method = RequestMethod.POST)JSONObject check(@RequestParam(name="queryEngine") String queryEngine, @RequestParam(name="querySql") String querySql, @RequestParam(name="jobNo") String jobNo);}

其中:pangu.url是配置在application.properties中的ip及端口

pangu.url = 192.168.1.3:8080/pangu/restful/check是要调的接口名

4、代码中调用

@Autowired
private PanGuService panGuService;
JSONObject jsonObject = null;
try {jsonObject = panGuService.auroraPriviledge(PRESTO_DRIVER, query.get("sql"), user.getWorkNo());
} catch (Exception e) {throw new Exception("请求系统异常");
}
if (PANGU_FAIL.equals(jsonObject.get("code"))) {LOG.info(jsonObject.get("msg").toString());throw new BusinessException(jsonObject.get("msg").toString());
}

方案二:使用原始httpClient请求

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

  1. 创建HttpClient对象。

  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

  6. 释放连接。无论执行方法是否成功,都必须释放连接。

@Autowired
private PanGuService panGuService;
JSONObject jsonObject = null;
try {jsonObject = panGuService.auroraPriviledge(PRESTO_DRIVER, query.get("sql"), user.getWorkNo());
} catch (Exception e) {throw new Exception("请求系统异常");
}
if (PANGU_FAIL.equals(jsonObject.get("code"))) {LOG.info(jsonObject.get("msg").toString());throw new BusinessException(jsonObject.get("msg").toString());
}

方案三:使用RestTemplate方法

1.get请求:getForObject(…)和getForEntity(…)两个方法,区别在于前者直接返回预期的对象,即返回体中的body对象,后者返回的是ResponseEntity封装类,里面包含了HTTP请求的头信息。

2.post请求:与get请求类似,只是多一个request参数,request对象会作为httpEntity进行处理。

package com.yyy.aurora;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;public class TestRest {public static void main(String[] args) {RestTemplate restTemplate = new RestTemplate();//get请求//方法一:getForEntity(String url, Class<T> responseType, Object... uriVariables),没有参数String url = "https://restapi.amap.com/v3/ip?key=075b6eddd825148a674dfa8a8558ac62"ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);System.out.println(forEntity);// <200,{"status":"1","info":"OK","infocode":"10000","province":"上海市","city":"上海","adcode":"310000","rectangle":"120.8397067,30.77980118;122.1137989,31.66889673"},{Server=[Tengine], Date=[Sat, 18 Apr 2020 02:47:38 GMT], Content-Type=[application/json;charset=UTF-8], Content-Length=[167], Connection=[close], X-Powered-By=[ring/1.0.0], gsid=[011130051098158717805837600019751129378], sc=[0.071], Access-Control-Allow-Origin=[*], Access-Control-Allow-Methods=[*], Access-Control-Allow-Headers=[DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,key,x-biz,x-info,platinfo,encr,enginever,gzipped,poiid]}>String s = restTemplate.getForObject(url, String.class);System.out.println(s);// {"province":"上海市","city":"上海市","adcode":"310000","infocode":"10000","rectangle":"120.8397067,30.77980118;122.1137989,31.66889673","status":"1","info":"OK"}//方法一:getForEntity(String url, Class<T> responseType, Object... uriVariables),url中用占位符,传入参数//该方法提供了三个参数,其中var1为请求的地址(即url),var2为请求响应body的包装类型,var3为url中的参数绑定url = "https://restapi.amap.com/v3/ip?key={?}";forEntity = restTemplate.getForEntity(url, String.class, "075b6eddd825148a674dfa8a8558ac62");//方法二:getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables),map传参url = "https://restapi.amap.com/v3/ip?key={key}";Map<String, Object> map = new HashMap<>();map.put("key", "075b6eddd825148a674dfa8a8558ac62");forEntity = restTemplate.getForEntity(url, String.class, map);//方法三:getForEntity(URI url, Class<T> responseType),uri传参URI uri = URI.create("https://restapi.amap.com/v3/ip?key=075b6eddd825148a674dfa8a8558ac62");forEntity = restTemplate.getForEntity(uri, String.class);//post请求,与get请求类型,只是多一个必填request对象//postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)forEntity = restTemplate.postForEntity(url, null, String.class, "075b6eddd825148a674dfa8a8558ac62");s = restTemplate.postForObject(url, null, String.class, "075b6eddd825148a674dfa8a8558ac62");}
}

补充:SpringBoot关于系统之间的远程互相调用

1、SpringBoot关于系统之间的远程互相调用

可以采用RestTemplate方式发起Rest Http调用,提供有get、post等方式。

1、1远程工具类

此处使用Post方式,参考下面封装的HttpClient类 1.1

/*** Desc: 远程连接工具类*/
@Service
public class HttpClient {/*** 根据远程地址发起访问-参数类型为form表单* @param url 远程地址* @param method 远程方法* @param params  方法参数* @return*/public Object client(String url,HttpMethod method,MultiValueMap<String,String> params){RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/x-www-form-urlencoded");HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, headers);ResponseEntity<String> responseEntity = restTemplate.postForEntity(url,httpEntity,String.class);String body = responseEntity.getBody();JSONObject jsonObject = JSONObject.parseObject(body);return jsonObject.get("data");}/*** 根据远程地址发起访问-参数类型为JSON* @param url 远程地址* @param method 远程方法* @aram params  方法参数* @eturn*/public Object clientJson(String url,HttpMethod method,Map<String,Object> params){RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON_UTF8);cn.hutool.json.JSONObject jsonObject = JSONUtil.parseFromMap(params);HttpEntity<cn.hutool.json.JSONObject> httpEntity = new HttpEntity<>(jsonObject, headers);ResponseEntity<String> responseEntity = restTemplate.postForEntity(url,httpEntity,String.class);String body = responseEntity.getBody();JSONObject jsonObjectResult = JSONObject.parseObject(body);return jsonObjectResult.get("data");}
}

1、2远程参数说明

工具类中提供了远程过程中传递参数的两种格式:

其中 headers.add(“Content-Type”, “application/x-www-form-urlencoded”) 为form表单格式,支持键值对数据传输;

当参数类型为form表单时,数据需要封装成MultiValueMap<String,String>格式,前台使用controller接受时,可以直接使用 MultiValueMap 变量接收,代码如下

接受参数为form对象

/*** 保存分组策略对象* @param* @return*/
@RequestMapping(value = "/saveDocGroupPolicy",method = RequestMethod.POST)
public ApiResult saveGroupPolicy(@RequestParam MultiValueMap<String,String> paramMap,@Valid GroupStrategyIO groupStrategyIO){Integer userId = ShiroUtil.getExamUserId();List<String> userList = new ArrayList<>();userList.add(userId+"");paramMap.put("userId",userList);Object jsonObject = httpClient.client(ExamConfigConstants.url+"/exam/configPolicy/saveDocGroupPolicy", HttpMethod.POST, paramMap);return ApiResult.success(jsonObject);
}
headers.setContentType(MediaType.APPLICATION_JSON_UTF8)

接收参数为复杂json串
为json数据格式

当参数为json格式时,远程服务器接受参数需加上注解@RequestBody,对于复杂参数可以使用对象接受,将对象转为Map,对数据进行加工,再将map转化为JSONObject

/*** 保存试卷策略* @param paperStrategyIO 试卷策略对象* @return*/@RequestMapping(value = "/savePaperConfig")
public ApiResult savePaperConfig(@RequestBody PaperStrategyIO paperStrategyIO){Map<String, Object> paramMap = BeanUtil.beanToMap(paperStrategyIO);Integer userId = ShiroUtil.getExamUserId();paramMap.put("userId",userId);Object jsonObject = httpClient.clientJson(ExamConfigConstants.url+"/exam/paper/savePaperConfigWithMap", HttpMethod.POST, paramMap);return ApiResult.success(jsonObject);
}

2、后记

关于RestTemplate还有很多可调用的API,可以查看官方网站了解

REST in Spring 3: RestTemplate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java读word_java读word文件(示例代码)

Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。1.读取word 2003及word 2007需要的jar包读取 2003 版本(.doc)的word文件相对来说比较简单&#xff0c;只需要 poi-3.5-beta6-20090622.jar 和 poi-scra…

Dubbo调用远程服务详解_导入jar方式

Dubbo调用远程服务 1.创建公共接口模块api 公共接口主要用于存放接口对象,这里我们只创建一个服务层的接口IndexService用于远程调用服务的测试 package com.example.dubboapi.service;public interface IndexService {String echo(); }

Dubbo SpringBoot+Dubbo泛化的使用,以及开发时直连本地的Dubbo服务(Dubbo指定点对点调用服务)

​ 一般情况我们使用dubbo)通过rpc调用dubbo提供方的服务&#xff0c;首先要在消费者的项目中引入接口提供者的jar包&#xff08;provider端暴露的接口和方法&#xff09;&#xff0c;然后使用jar包里面的类和方法&#xff0c;两端才能正常通信调用。但是如果要调N个不同服务提…

java string... 参数_Java String.Format() 方法及参数说明

JDK1.5中&#xff0c;String类新增了一个很有用的静态方法String.format():format(Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字…

Unity3D VS UE4

Unity3D&#xff08;U3D&#xff09; 1.视觉效果&#xff1a;Unity3D相对UE4略逊、手机3D应用、3D游戏轻量级首选&#xff0c;支持跨平台、设备兼容性更好 2.产品力&#xff1a;Unity3D更加多元化&#xff0c;各平台都有代表作&#xff0c;比如《王者荣耀》《炉石传说》《纪念…

java 打包边下载_JAVA实现边下载边压缩

ResponseBodypublic voiddownloadUrl(HttpServletResponse response, HttpServletRequest request){String sourceFilePathproperties.getString("sourceFilePath");//要下载的文件路径eavlProName xxx;//项目名String downloadName "xxx.zip"; //下载文…

Java将时间加1分钟的方法

SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date now new Date(); System.out.println("当前时间&#xff1a;" sdf.format(now));方法一&#xff1a; Date afterDate new Date(now .getTime() 60000); System.out.println…

对List集合中每个对象元素按时间顺序排序

需求&#xff1a; 需要对List中的每个student对象按照birthday顺序排序&#xff0c;时间由小到大排列。 1. 刚开始用的是冒泡排序&#xff0c;出现数据覆盖的情况 for (int i 0; i < list.size() - 1; i) {for (int j 0; j < list.size() - 1 - i; j) {long time li…

SpringBoot读取resource或template中的文件

Spring-Boot读取resource或template中的文件 1.项目场景&#xff1a; 以jar包方式部署系统&#xff0c;想读取resource或是template下面的文件时&#xff0c;报 File Not Found 我遇到的情况是&#xff0c;整个项目达成了一个包&#xff0c;在开发环境&#xff08;windows i…

java slot_LocalVariableTable之 Slot 复用

LocalVariableTable中的 Slot&#xff0c; 是存在复用现象的&#xff0c;这个我早就知道&#xff0c;但是&#xff0c;不太清楚是如何复用的。Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量slot做太多限制&#xff0c;只是规定了参数要从下标为0开始的局部…

关于使用this.getClass().getResource(“/“)获取文件时遇到的坑_ClassPathResource加载资源文件用法

最近在工作中遇到需要读取配置文件&#xff0c;然后第一想法就是将文件放到项目的resources目录下, 然后使用&#xff1a; String fileName "config/zh.md" String path this.getClass().getResource("/").getPath() fileName; System.out.println(p…

Objects.requireNonNull( )方法说明

Objects.requireNonNull( )方法在java.util.Objects中 作用就是判断一个对象是否为空 底层源码&#xff1a; /* param obj 需要检测是否为空的对象* param <T> 对象类型* return 对象不为空则返回该对象* throws 对象为空则报NullPointerException异常*/public static …

java 类的执行顺序_Java-类加载和main()方法的执行顺序?

2、类加载和main()的执行顺序&#xff1f;备注&#xff1a;执行main()方法会先加载main()方法所在的类。存在继承关系中&#xff0c;创建子类对象初始化过程为:父类静态成员和语句块子类静态成员和静态语句块父类普通成员和普通语句块父类构造函数子类普通成员和普通语句块父类…

利用Gson解析多层嵌套的JSON数据

数据实例: {"error": 0,"status": "success","results": [{"currentCity": "青岛","index"

编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...

【多选题】下列关于多行注释的应用,正确的是( )【单选题】是在思维中把对象分解为各个部分、侧面、属性以及阶段,分别加以考察的方法。(1.0分)【判断题】多行注释“/*...*/”中不可以嵌套单行注释“//”。( )【多选题】直觉具有( )等特性。(2.0分)【多选题】马克思主义科学技术…

数据模型 同比 环比_同比和环比计算公式?

一、同比增长计算公式&#xff1a; 1、同比增长率(本期数&#xff0d;同期数)同期数100% 例子&#xff1a;比如说去年3月的产32313133353236313431303231363533e4b893e5b19e31333365666237值100万&#xff0c;本年3月的产值300万&#xff0c;同比增长率是多少&#xff1f; 本…

mysql80配置环境变量_MySQL:安装与配置

一、MySQL安装0、下载社区版安装包1、进入安装页面&#xff0c;这里不选择默认安装的所有工具&#xff0c;仅选择Server only。2、如果没有VC环境就点击execute安装&#xff0c;已安装就继续下一步。3、安装MySQL服务&#xff0c;Next。4、进入MySQL的配置环节&#xff0c;首先…

解决SVN无法add to ignore list的问题

有时候&#xff0c;在SVN中添加某文件夹到忽略列表即add to ignore list的时候报错&#xff0c;无法添加进忽略列表&#xff0c;这里总结一下&#xff0c;无非就是两个原因 仓库中已经存在了该文件夹的历史版本&#xff0c;因而无法忽略 解决方法&#xff1a;先备份该文件夹&am…

oracle正则表达式包含但不含_Oracle 正则表达式(详细)

Oracle 正则表达式正则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板&#xff0c;将某个字符模式与所搜索的字符串进行匹配。本文详细地列出了能在正则表达式中使用…

获取某个月中的第一天和最后一天某个月的天数当月第一天,当月最后一天,当年的第一天,当年的最后一天

获取某个月中的第一天和最后一天&某个月的天数 public static void main(String args[]){int month 2;// 2月Calendar cal Calendar.getInstance();cal.set(Calendar.YEAR, 2022);cal.set(Calendar.MONTH, month - 1);int max cal.getActualMaximum(Calendar.DATE);int…