成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用SpringBoot跨系統(tǒng)調(diào)用接口的方案

瀏覽:6日期:2023-03-26 14:25:45
一、簡(jiǎn)介

項(xiàng)目開發(fā)中存在系統(tǒng)之間互調(diào)問(wèn)題,又不想用dubbo,這里提供幾種springboot方案:

1、使用Feign進(jìn)行消費(fèi)(推薦)

2、使用原始httpClient請(qǐng)求

3、使用RestTemplate方法

二、方案方案一:使用Feign進(jìn)行消費(fèi)(推薦)

1、在maven中添加依賴

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

2、啟動(dòng)類上加上@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是要調(diào)的接口名

4、代碼中調(diào)用

@Autowired private PanGuService panGuService; JSONObject jsonObject = null; try { jsonObject = panGuService.auroraPriviledge(PRESTO_DRIVER, query.get('sql'), user.getWorkNo()); } catch (Exception e) { throw new Exception('請(qǐng)求系統(tǒng)異常'); } if (PANGU_FAIL.equals(jsonObject.get('code'))) { LOG.info(jsonObject.get('msg').toString()); throw new BusinessException(jsonObject.get('msg').toString()); }方案二:使用原始httpClient請(qǐng)求

使用HttpClient發(fā)送請(qǐng)求、接收響應(yīng)很簡(jiǎn)單,一般需要如下幾步即可。

1. 創(chuàng)建HttpClient對(duì)象。

2. 創(chuàng)建請(qǐng)求方法的實(shí)例,并指定請(qǐng)求URL。如果需要發(fā)送GET請(qǐng)求,創(chuàng)建HttpGet對(duì)象;如果需要發(fā)送POST請(qǐng)求,創(chuàng)建HttpPost對(duì)象。

3. 如果需要發(fā)送請(qǐng)求參數(shù),可調(diào)用HttpGet、HttpPost共同的setParams(HttpParams params)方法來(lái)添加請(qǐng)求參數(shù);對(duì)于HttpPost對(duì)象而言,也可調(diào)用setEntity(HttpEntity entity)方法來(lái)設(shè)置請(qǐng)求參數(shù)。

4. 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求,該方法返回一個(gè)HttpResponse。

5. 調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過(guò)該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。

6. 釋放連接。無(wú)論執(zhí)行方法是否成功,都必須釋放連接。

public JSONObject doPost(String queryEngine, String querySql, String jobNo) { JSONObject jsonObject = null; //1.創(chuàng)建httpClient對(duì)象 CloseableHttpClient client = HttpClients.createDefault(); //2.創(chuàng)建請(qǐng)求方法的實(shí)例,并指定請(qǐng)求URL String url = 'http://192.168.1.11:8080'; HttpPost post = new HttpPost(url); post.setHeader('Content-Type', 'application/json;charset=utf8'); //3.參數(shù) 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.調(diào)用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請(qǐng)求:getForObject(...)和getForEntity(...)兩個(gè)方法,區(qū)別在于前者直接返回預(yù)期的對(duì)象,即返回體中的body對(duì)象,后者返回的是ResponseEntity封裝類,里面包含了HTTP請(qǐng)求的頭信息。

2.post請(qǐng)求:與get請(qǐng)求類似,只是多一個(gè)request參數(shù),request對(duì)象會(huì)作為httpEntity進(jìn)行處理。

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請(qǐng)求 //方法一:getForEntity(String url, Class<T> responseType, Object... uriVariables),沒(méi)有參數(shù) 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中用占位符,傳入?yún)?shù) //該方法提供了三個(gè)參數(shù),其中var1為請(qǐng)求的地址(即url),var2為請(qǐng)求響應(yīng)body的包裝類型,var3為url中的參數(shù)綁定 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請(qǐng)求,與get請(qǐng)求類型,只是多一個(gè)必填request對(duì)象 //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'); }}

補(bǔ)充:SpringBoot關(guān)于系統(tǒng)之間的遠(yuǎn)程互相調(diào)用

1、SpringBoot關(guān)于系統(tǒng)之間的遠(yuǎn)程互相調(diào)用

可以采用RestTemplate方式發(fā)起Rest Http調(diào)用,提供有g(shù)et、post等方式。

1、1遠(yuǎn)程工具類

此處使用Post方式,參考下面封裝的HttpClient類 1.1

/** * Created by @kai on 2018/12/24/024. * Time: 13:54 * Desc: 遠(yuǎn)程連接工具類 */@Servicepublic class HttpClient {​ /** * 根據(jù)遠(yuǎn)程地址發(fā)起訪問(wèn)-參數(shù)類型為form表單 * @param url 遠(yuǎn)程地址 * @param method 遠(yuǎn)程方法 * @param params 方法參數(shù) * @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'); }​ /** * 根據(jù)遠(yuǎn)程地址發(fā)起訪問(wèn)-參數(shù)類型為JSON * @param url 遠(yuǎn)程地址 * @param method 遠(yuǎn)程方法 * @param params 方法參數(shù) * @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遠(yuǎn)程參數(shù)說(shuō)明

工具類中提供了遠(yuǎn)程過(guò)程中傳遞參數(shù)的兩種格式:

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

當(dāng)參數(shù)類型為form表單時(shí),數(shù)據(jù)需要封裝成MultiValueMap<String,String>格式,前臺(tái)使用controller接受時(shí),可以直接使用 MultiValueMap 變量接收,參照代碼如下 1.2

/** * 保存分組策略對(duì)象 * @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] 接受參數(shù)為form對(duì)象

headers.setContentType(MediaType.APPLICATION_JSON_UTF8)

為json數(shù)據(jù)格式

當(dāng)參數(shù)為json格式時(shí),遠(yuǎn)程服務(wù)器接受參數(shù)需加上注解@RequestBody,對(duì)于復(fù)雜參數(shù)可以使用對(duì)象接受,將對(duì)象轉(zhuǎn)為Map,對(duì)數(shù)據(jù)進(jìn)行加工,再將map轉(zhuǎn)化為JSONObject,參照代碼如下:1.3

/** * 保存試卷策略 * @param paperStrategyIO 試卷策略對(duì)象 * @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​] 接收參數(shù)為復(fù)雜json串

2、后記

關(guān)于RestTemplate還有很多可調(diào)用的API,可以查看官方網(wǎng)站了解

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Spring
相關(guān)文章: