最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年01月30日 13:11:15   作者:仙道Bob  
這篇文章主要介紹了使用SpringBoot跨系統(tǒng)調(diào)用接口的方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

一、簡(jiǎn)介

項(xiàng)目開發(fā)中存在系統(tǒng)之間互調(diào)問題,又不想用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)方法來添加請(qǐng)求參數(shù);對(duì)于HttpPost對(duì)象而言,也可調(diào)用setEntity(HttpEntity entity)方法來設(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)容。程序可通過該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。

6. 釋放連接。無論執(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),沒有參數(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)程連接工具類
 */
@Service
public class HttpClient {
​
 /**
 * 根據(jù)遠(yuǎn)程地址發(fā)起訪問-參數(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ā)起訪問-參數(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ù)說明

工具類中提供了遠(yuǎn)程過程中傳遞參數(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è)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • RabbitMQ 避免消息重復(fù)消費(fèi)的方法

    RabbitMQ 避免消息重復(fù)消費(fèi)的方法

    消費(fèi)者端實(shí)現(xiàn)冪等性,意味著消息永遠(yuǎn)不會(huì)消費(fèi)多次,即使收到了多條一樣的消息,這篇文章給大家分享RabbitMQ 避免消息重復(fù)消費(fèi)的方法,感興趣的朋友一起看看吧
    2024-03-03
  • jsp中EL表達(dá)式獲取數(shù)據(jù)

    jsp中EL表達(dá)式獲取數(shù)據(jù)

    EL 全名為Expression Language。本文給大家介紹的是在jsp中EL表達(dá)式獲取數(shù)據(jù)的幾種方式,希望大家能夠喜歡
    2016-07-07
  • Java Stream 流實(shí)現(xiàn)合并操作示例

    Java Stream 流實(shí)現(xiàn)合并操作示例

    這篇文章主要介紹了Java Stream 流實(shí)現(xiàn)合并操作,結(jié)合實(shí)例形式詳細(xì)分析了Java Stream 流實(shí)現(xiàn)合并操作原理與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 深入剖析springBoot中的@Scheduled執(zhí)行原理

    深入剖析springBoot中的@Scheduled執(zhí)行原理

    這篇文章主要介紹了springBoot中的@Scheduled執(zhí)行原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • MyBatis通用Mapper實(shí)現(xiàn)原理及相關(guān)內(nèi)容

    MyBatis通用Mapper實(shí)現(xiàn)原理及相關(guān)內(nèi)容

    今天小編就為大家分享一篇關(guān)于MyBatis通用Mapper實(shí)現(xiàn)原理及相關(guān)內(nèi)容,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java 構(gòu)造方法的使用詳解

    Java 構(gòu)造方法的使用詳解

    構(gòu)造方法是類的一種特殊方法,用來初始化類的一個(gè)新的對(duì)象,在創(chuàng)建對(duì)象(new 運(yùn)算符)之后自動(dòng)調(diào)用。Java 中的每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法,并且可以有一個(gè)以上的構(gòu)造方法
    2021-11-11
  • Netty分布式客戶端處理接入事件handle源碼解析

    Netty分布式客戶端處理接入事件handle源碼解析

    這篇文章主要為大家介紹了Netty源碼分析客戶端流程處理接入事件handle創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java 內(nèi)部類的詳解及實(shí)例

    java 內(nèi)部類的詳解及實(shí)例

    這篇文章主要介紹了 java 內(nèi)部類的詳解及實(shí)例的相關(guān)資料,這里提供了兩種內(nèi)部類的實(shí)現(xiàn)方法,并給出實(shí)例,需要的朋友可以參考下
    2017-08-08
  • Java IText異常NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable的解決方法

    Java IText異常NoClassDefFoundError: org/bouncycastle

    在使用Java進(jìn)行PDF文檔操作時(shí),iText是一個(gè)非常強(qiáng)大的庫(kù),然而,在實(shí)際開發(fā)過程中,可能會(huì)遇到一些異常情況,其中之一就是??NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable??,本文將探討這個(gè)錯(cuò)誤的原因及其解決方案,需要的朋友可以參考下
    2025-02-02
  • SpringBoot進(jìn)行Web開發(fā)的實(shí)現(xiàn)

    SpringBoot進(jìn)行Web開發(fā)的實(shí)現(xiàn)

    Spring?Boot讓我們可以快速構(gòu)建項(xiàng)目并運(yùn)行web應(yīng)用,大大簡(jiǎn)化了Spring的復(fù)雜配置,本文主要介紹了SpringBoot進(jìn)行Web開發(fā)的實(shí)現(xiàn),感興趣的可以了解一下
    2023-10-10

最新評(píng)論

肇州县| 南安市| 塔城市| 康乐县| 商水县| 收藏| 白玉县| 乌拉特中旗| 彰化县| 上栗县| 天峻县| 和平区| 牡丹江市| 文成县| 白河县| 会理县| 元谋县| 泊头市| 阿图什市| 吴川市| 昌宁县| 宁陕县| 博罗县| 德州市| 唐河县| 石景山区| 务川| 威远县| 杨浦区| 泽库县| 潜江市| 广西| 沾化县| 南陵县| 恭城| 梅河口市| 酒泉市| 唐河县| 马尔康县| 论坛| 宿迁市|