溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用spring-boot集成httpClient實(shí)現(xiàn)遠(yuǎn)程調(diào)用

發(fā)布時(shí)間:2020-06-04 18:51:14 來(lái)源:億速云 閱讀:521 作者:Leah 欄目:編程語(yǔ)言

  如何用spring-boot集成httpClient實(shí)現(xiàn)遠(yuǎn)程調(diào)用?這篇文章運(yùn)用了實(shí)例代碼展示,代碼非常詳細(xì),可供感興趣的小伙伴們參考借鑒,希望對(duì)大家有所幫助。

  引入相關(guān)依賴:

  org.apache.httpcomponents

  httpclient

  4.5.9

  com.alibaba

  fastjson

  1.2.47

  org.springframework.boot

  spring-boot-configuration-processor

  true

  創(chuàng)建HttpClientUtil工具類(lèi),代碼如下:

  package com.test.demo;

  import com.alibaba.fastjson.JSON;

  import com.test.demo.model.User;

  import org.apache.http.HttpEntity;

  import org.apache.http.NameValuePair;

  import org.apache.http.ParseException;

  import org.apache.http.client.ClientProtocolException;

  import org.apache.http.client.config.RequestConfig;

  import org.apache.http.client.methods.CloseableHttpResponse;

  import org.apache.http.client.methods.HttpGet;

  import org.apache.http.client.methods.HttpPost;

  import org.apache.http.client.utils.URIBuilder;

  import org.apache.http.entity.StringEntity;

  import org.apache.http.impl.client.CloseableHttpClient;

  import org.apache.http.impl.client.HttpClientBuilder;

  import org.apache.http.util.EntityUtils;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.stereotype.Component;

  import java.io.IOException;

  import java.net.URI;

  import java.net.URISyntaxException;

  import java.util.List;

  /**

  * ClassName: HttpClientTest

  * Package: com.test.demo

  * Description: httpClient方法封裝

  * Datetime: 2020/1/13 10:45

  * Author: zhoukaishun

  */

  @Component

  public class HttpClientUtil {

  @Autowired

  private HttpClientConfigure httpClientConfigure;

  /**

  * @description GET封裝

  * @author zhoukaishun

  * @date 2020/1/13 13:12

  */

  public void doGetHttp(List params,Boolean haveParams) {

  // 獲得Http客戶端

  CloseableHttpClient httpClient = HttpClientBuilder.create().build();

  // 參數(shù)

  URI uri = null;

  try {

  // 設(shè)置uri信息,并將參數(shù)集合放入uri;

  if(haveParams){//有參調(diào)用

  uri = new URIBuilder().setScheme(httpClientConfigure.getScheme()).setHost(httpClientConfigure.getHost())

  .setPort(httpClientConfigure.getPort()).setPath(httpClientConfigure.getMapPath().get("interface2"))

  .setParameters(params).build();

  }else{//無(wú)參調(diào)用

  uri = new URIBuilder().setScheme(httpClientConfigure.getScheme()).setHost(httpClientConfigure.getHost())

  .setPort(httpClientConfigure.getPort()).setPath(httpClientConfigure.getMapPath().get("interface1"))

  .build();

  }

  } catch (URISyntaxException e1) {

  e1.printStackTrace();

  }

  // 創(chuàng)建Get請(qǐng)求

  HttpGet httpGet = new HttpGet(uri);

  // 響應(yīng)模型

  CloseableHttpResponse response = null;

  try {

  // 配置信息

  RequestConfig requestConfig = RequestConfig.custom()

  // 設(shè)置連接超時(shí)時(shí)間(單位毫秒)

  .setConnectTimeout(5000)

  // 設(shè)置請(qǐng)求超時(shí)時(shí)間(單位毫秒)

  .setConnectionRequestTimeout(5000)

  // socket讀寫(xiě)超時(shí)時(shí)間(單位毫秒)

  .setSocketTimeout(5000)

  // 設(shè)置是否允許重定向(默認(rèn)為true)

  .setRedirectsEnabled(true).build();

  // 將上面的配置信息 運(yùn)用到這個(gè)Get請(qǐng)求里

  httpGet.setConfig(requestConfig);

  // 由客戶端執(zhí)行(發(fā)送)Get請(qǐng)求

  response = httpClient.execute(httpGet);

  // 從響應(yīng)模型中獲取響應(yīng)實(shí)體

  HttpEntity responseEntity = response.getEntity();

  System.out.println("響應(yīng)狀態(tài)為:" + response.getStatusLine());

  if (responseEntity != null) {

  System.out.println("響應(yīng)內(nèi)容長(zhǎng)度為:" + responseEntity.getContentLength());

  System.out.println("響應(yīng)內(nèi)容為:" + EntityUtils.toString(responseEntity));

  }

  } catch (ClientProtocolException e) {

  e.printStackTrace();

  } catch (ParseException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  } finally {

  try {

  // 釋放資源

  if (httpClient != null) {

  httpClient.close();

  }

  if (response != null) {

  response.close();

  }

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  }

  /**

  * @description POST封裝

  * @author zhoukaishun

  * @date 2020/1/13 14:01

  */

  public void doPostHttp(User user,Boolean haveParam) {

  // 獲得Http客戶端

  CloseableHttpClient httpClient = HttpClientBuilder.create().build();

  URI uri = null;

  try {

  // 設(shè)置uri信息,并將參數(shù)集合放入uri;

  uri = new URIBuilder().setScheme(httpClientConfigure.getScheme()).setHost(httpClientConfigure.getHost())

  .setPort(httpClientConfigure.getPort())

  .setPath(haveParam?httpClientConfigure.getMapPath().get("interface4"):httpClientConfigure.getMapPath().get("interface3"))

  .build();

  } catch (URISyntaxException e1) {

  e1.printStackTrace();

  }

  // 創(chuàng)建Post請(qǐng)求

  HttpPost httpPost = new HttpPost(uri);

  if(haveParam){

  //入?yún)?/p>

  // 利用阿里的fastjson,將Object轉(zhuǎn)換為json字符串;

  // (需要導(dǎo)入com.alibaba.fastjson.JSON包)

  String jsonString = JSON.toJSONString(user);

  StringEntity entity = new StringEntity(jsonString, "UTF-8");

  // post請(qǐng)求是將參數(shù)放在請(qǐng)求體里面?zhèn)鬟^(guò)去的;這里將entity放入post請(qǐng)求體中

  httpPost.setEntity(entity);

  httpPost.setHeader("Content-Type", "application/json;charset=utf8");

  }

  // 響應(yīng)模型

  CloseableHttpResponse response = null;

  try {

  // 由客戶端執(zhí)行(發(fā)送)Post請(qǐng)求

  response = httpClient.execute(httpPost);

  // 從響應(yīng)模型中獲取響應(yīng)實(shí)體

  HttpEntity responseEntity = response.getEntity();

  System.out.println("響應(yīng)狀態(tài)為:" + response.getStatusLine());

  if (responseEntity != null) {

  System.out.println("響應(yīng)內(nèi)容長(zhǎng)度為:" + responseEntity.getContentLength());

  System.out.println("響應(yīng)內(nèi)容為:" + EntityUtils.toString(responseEntity));

  }鄭州婦科醫(yī)院哪家好 https://yiyuan.120ask.com/zzfck/

  } catch (ClientProtocolException e) {

  e.printStackTrace();

  } catch (ParseException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  } finally {

  try {

  // 釋放資源

  if (httpClient != null) {

  httpClient.close();

  }

  if (response != null) {

  response.close();

  }

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  }

  }

  其中大部分代碼基本不變,只有對(duì)url的拼接做了一些處理,可以看到我們注入了一個(gè)HttpClientConfigure實(shí)例,因?yàn)槲覀冃枰L問(wèn)的路徑情況有很多種,但是我們不可能每次都去改util下的url拼接代碼,所以引入一個(gè)HttpClientConfigure,這是我自定義的一個(gè)類(lèi),用于存儲(chǔ)我們拼接url可能遇到的情況。代碼如下:

  package com.test.demo;

  import lombok.Data;

  import org.springframework.boot.context.properties.ConfigurationProperties;

  import org.springframework.stereotype.Component;

  import java.util.HashMap;

  import java.util.Map;

  /**

  * ClassName: HttpClientConfigure

  * Package: com.test.demo

  * Description: 接收配置信息

  * Datetime: 2020/1/13 14:41

  * Author: zhoukaishun

  */

  @Component

  @ConfigurationProperties(prefix="httpclientconfigure")

  @Data

  public class HttpClientConfigure {

  private Map mapPath = new HashMap<>();

  private String scheme;

  private String host;

  private Integer port;

  }

  其中的@ConfigurationProperties注解 前面提到過(guò),在pom中,其中屬性值配置在yml文件中,如下(具體內(nèi)容根據(jù)自己的需求來(lái)定):

  到這里就可以開(kāi)始測(cè)試了,可以在本地啟動(dòng)兩個(gè)服務(wù)(一個(gè)服務(wù)也行),根據(jù)自己controller里面的訪問(wèn)路徑配置httpclientconfigure,然后直接調(diào)用自己controller里方法即可。

  以我的demo為例,調(diào)用者controller代碼如下:

  @GetMapping

  @RequestMapping("/doGetHaveNoParam")

  public void doGetHaveNoParam(){

  httpClientUtil.doGetHttp(null,false);

  }

  @GetMapping

  @RequestMapping("/doGetHaveParam")

  public void doGetHaveParam(){

  System.out.println("調(diào)用有參Get請(qǐng)求,當(dāng)前時(shí)間:"+System.currentTimeMillis());

  List params = new ArrayList<>();

  params.add(new BasicNameValuePair("name", "&"));

  params.add(new BasicNameValuePair("age", "22"));

  httpClientUtil.doGetHttp(params,true);

  }

  @PostMapping

  @RequestMapping("/doPostHaveNoParam")

  public void doPostHaveNoParam(){

  httpClientUtil.doPostHttp(null,false);

  }

  @PostMapping

  @RequestMapping("/doPostHaveParam")

  public void doPostHaveParam(){

  httpClientUtil.doPostHttp(new User("name",11),true);

  }

  被調(diào)用者controller代碼如下:

  @RequestMapping("/doGetHaveNoParam")

  public String doGetHaveNoParam(){

  return "doGetHaveNoParam successful";

  }

  @RequestMapping("/doGetHaveParam")

  public List doGetHaveParam(String name,Integer age){

  return getUserByAge(name,age);

  }

  @PostMapping

  @RequestMapping("/doPostHaveNoParam")

  public String doPostHaveNoParam(){

  return "doPostHaveNoParam successful";

  }

  @PostMapping

  @RequestMapping("/doPostHaveParam")

  public String doHttpPostParam(@RequestBody User user){

  return "do Post params:name="+user.getName()+",age="+user.getAge();

  使用postman測(cè)試如下:

  請(qǐng)求路徑分別為:

  http://localhost:8081/user/doGetHaveNoParam

  http://localhost:8081/user/doGetHaveParam

  http://localhost:8081/user/doPostHaveNoParam

  http://localhost:8081/user/doPostHaveParam

  以上就是用spring-boot集成httpClient實(shí)現(xiàn)遠(yuǎn)程調(diào)用的方法,代碼詳細(xì)清楚,如果在日常工作遇到這個(gè)問(wèn)題,希望你能通過(guò)這篇文章解決問(wèn)題。如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道!


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI