电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

使用SpringBoot跨系統調用接口的方案

瀏覽:3日期:2023-03-26 14:25:45
一、簡介

項目開發中存在系統之間互調問題,又不想用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. 釋放連接。無論執行方法是否成功,都必須釋放連接。

public JSONObject doPost(String queryEngine, String querySql, String jobNo) { JSONObject jsonObject = null; //1.創建httpClient對象 CloseableHttpClient client = HttpClients.createDefault(); //2.創建請求方法的實例,并指定請求URL String url = 'http://192.168.1.11:8080'; HttpPost post = new HttpPost(url); post.setHeader('Content-Type', 'application/json;charset=utf8'); //3.參數 AuroraPriviledge auroraPriviledge = new AuroraPriviledge(); auroraPriviledge.setQueryEngine(queryEngine); auroraPriviledge.setQuerySql(querySql); auroraPriviledge.setJobNo(jobNo); String jsonString = JSON.toJSONString(auroraPriviledge); StringEntity entity = new StringEntity(jsonString, 'UTF-8'); post.setEntity(entity); //4.調用execute,返回response CloseableHttpResponse response = null; try { response = client.execute(post); HttpEntity responseEntity = response.getEntity(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (client != null) { client.close(); } if (response != null) { response.close(); } } catch (IOException e) { e.printStackTrace(); } } return jsonObject; }方案三:使用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; /** * Description * * @author Bob * @date 2020/4/15 **/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

/** * Created by @kai on 2018/12/24/024. * Time: 13:54 * Desc: 遠程連接工具類 */@Servicepublic 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 遠程方法 * @param params 方法參數 * @return */ 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.1​]

1、2遠程參數說明

工具類中提供了遠程過程中傳遞參數的兩種格式:

其中 headers.add('Content-Type', 'application/x-www-form-urlencoded') 為form表單格式,支持鍵值對數據傳輸;

當參數類型為form表單時,數據需要封裝成MultiValueMap<String,String>格式,前臺使用controller接受時,可以直接使用 MultiValueMap 變量接收,參照代碼如下 1.2

/** * 保存分組策略對象 * @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);}

[ 1.2] 接受參數為form對象

headers.setContentType(MediaType.APPLICATION_JSON_UTF8)

為json數據格式

當參數為json格式時,遠程服務器接受參數需加上注解@RequestBody,對于復雜參數可以使用對象接受,將對象轉為Map,對數據進行加工,再將map轉化為JSONObject,參照代碼如下:1.3

/** * 保存試卷策略 * @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);}

[ 1.3​] 接收參數為復雜json串

2、后記

關于RestTemplate還有很多可調用的API,可以查看官方網站了解

http://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | crm客户关系管理系统,销售管理系统,crm系统,在线crm,移动crm系统 - 爱客crm | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 创客匠人-让IP变现不走弯路 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 氮化镓芯片-碳化硅二极管 - 华燊泰半导体| 信阳市建筑勘察设计研究院有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 真空乳化机-灌装封尾机-首页-温州精灌 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 耐火砖厂家,异形耐火砖-山东瑞耐耐火材料厂 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 服务器之家 - 专注于服务器技术及软件下载分享 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 |