淘宝客网站推广备案信息,网络架构和网络拓扑的区别,定制鞋子哪个网站好,网站建设与维护心得体会SpringBoot调用外部接口的几种方式 使用FeignClient调用1、在使用方引入依赖2、服务接口调用方2.1、在启动类上加上EnableFeigncliens注解2.2、编写Feign接口调用服务controller层2.3、服务接口调用service层 3、服务接口提供者4、说明 使用RestTemplate调用1、引入依赖2、Rest… SpringBoot调用外部接口的几种方式 使用FeignClient调用1、在使用方引入依赖2、服务接口调用方2.1、在启动类上加上EnableFeigncliens注解2.2、编写Feign接口调用服务controller层2.3、服务接口调用service层 3、服务接口提供者4、说明 使用RestTemplate调用1、引入依赖2、RestTemplateConfig配置类3、接口调用 使用WebClient调用1、引入依赖2、接口调用示例 使用Apache HttpClient调用使用HttpURLConnection调用使用OkHttp调用1、引入依赖2、示例代码 使用AsyncHttpClient调用1、引入依赖2、示例代码 使用FeignClient调用
FeignClient调用大多用于微服务开发中各服务之间的接口调用。它以Java接口注解的方式调用HTTP请求使服务间的调用变得简单1、在使用方引入依赖
!-- Feign注解 这里openFeign的版本要和自己使用的SpringBoot匹配--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId!-- version4.0.1/version --
/dependency2、服务接口调用方
2.1、在启动类上加上EnableFeigncliens注解 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;SpringBootApplication
EnableFeignClients
public class StudyfeignApplication {public static void main(String[] args) {SpringApplication.run(StudyfeignApplication.class, args);System.out.println(项目启动成功);}}2.2、编写Feign接口调用服务controller层
import com.hysoft.studyfeign.service.SysUserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(feign)
public class SysUserController {Autowiredprivate SysUserClient sysUserClient;PostMapping(getUserId)public void getUserId(String userId){this.sysUserClient.getUserById(userId);}}2.3、服务接口调用service层
feign的客户端需要使用FeignClient注解进行表示这样扫描时才知道这是一个feign客户端。FeignClient最常用的就两个属性一个name用于给客户端定义一个唯一的名称另一个就是url用于定义该客户端调用的远程地址。url中的内容可以写在配置文件application.yml中便于管理Service
FeignClient(name feign-service,url ${master-getuserbyId})
public interface SysUserClient {PostMapping(/master/test)String getUserById(String id);}application.yml中的配置如下
server:port: 8081
master-getuserbyId: http://localhost:80803、服务接口提供者
对于接口提供者来说没有特别要求和正常的接口开发一样4、说明
需要说明的是在接口调用方可以继续拓展service层书写service实现层进一步进行拓展 import org.springframework.stereotype.Service;Service
public class SysUserClientImpl implements SysUserClient{Overridepublic String getUserById(String id) {return ;}
}使用RestTemplate调用
RestTemplate中几个常用的方法getForObject()、getForEntity()、postForObject()、postForEntity()。其中getForObject() 和 getForEntity() 方法可以用来发送 GET 请求1、引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency2、RestTemplateConfig配置类
SimpleClientHttpRequestFactory类对应的HTTP库是JDK自带的HttpUrlConnection当然我们可以根据自身的需求使用其他的HTTP库例如HttpComponentsAsyncClientHttpRequestFactoryConfiguration
public class RestTemplateConfig {Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);//单位为msfactory.setConnectTimeout(5000);//单位为msreturn factory;}
}3、接口调用 RestController
public class TestRestTemplate {Resourceprivate RestTemplate restTemplate;GetMapping(value /saveUser)public void saveUser(String userId) {String url http://127.0.0.1:8080/master/test;Map map new HashMap();map.put(userId, hy001);String results restTemplate.postForObject(url, map, String.class);}}使用WebClient调用
Spring3.0引入了RestTemplate但是在后来的官方源码中介绍RestTemplate有可能在未来的版本中被弃用所谓替代RestTemplate在Spring5中引入了WebClient作为异步的非阻塞、响应式的HTTP客户端。1、引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId
/dependency2、接口调用示例 public class TestWebClient {Testpublic void doGet() {String userId 郭郭;String url http://127.0.0.1:8080/master/test/getSysUserById?userId{userId};MonoString mono WebClient//创建WebClient实例.create()//方法调用WebClient中提供了多种方法.get()//请求url.uri(url, userId)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println(响应结果 mono.block());}Testpublic void doPost() {Map map new HashMap();map.put(name, 郭郭);String requestBody JSON.toJSONString(map);String url http://127.0.0.1:8080/master/test/saveUser;MonoString mono WebClient//创建WebClient实例.create()//方法调用WebClient中提供了多种方法.post()//请求url.uri(url)//指定请求的Content-Type为JSON.contentType(MediaType.APPLICATION_JSON)//使用bodyValue方法传递请求体.bodyValue(requestBody)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println(响应结果 mono.block());}
}在上述doPost请求中我们的请求接口入参是一个Map但是需要转换为JSON格式传递这是因为WebClient默认是使用JSON序列化的。使用Apache HttpClient调用 public class TestHttpClient {Testpublic void doGet() throws IOException {//步骤一创建httpClient实例CloseableHttpClient httpClient HttpClients.createDefault();//步骤二创建HTTP请求HttpGet httpGet new HttpGet(http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId郭郭);//步骤三发送请求并获取响应数据CloseableHttpResponse response httpClient.execute(httpGet);//步骤四处理响应数据HttpEntity entity response.getEntity();String result EntityUtils.toString(entity);//步骤五关闭httpClient和responseresponse.close();httpClient.close();}Testpublic void doPost() throws IOException {//步骤一创建httpClient实例CloseableHttpClient httpClient HttpClients.createDefault();//步骤二创建HTTP请求HttpPost httpPost new HttpPost(http://127.0.0.1:8094/masterdata/sysUser/saveUser);//步骤三设置请求体数据使用JSON格式Map map new HashMap();map.put(name, 郭郭);String requestBody JSON.toJSONString(map);StringEntity stringEntity new StringEntity(requestBody, UTF-8);stringEntity.setContentType(application/json);httpPost.setEntity(stringEntity);//步骤四发送请求并获取响应数据CloseableHttpResponse response httpClient.execute(httpPost);//步骤五处理响应数据HttpEntity entity response.getEntity();String result EntityUtils.toString(entity);//步骤五关闭httpClient和responseresponse.close();httpClient.close();}
}使用HttpURLConnection调用 public class TestHttpURLConnection {Testpublic void doGet() throws IOException {String userId 郭郭; // 参数值userId URLEncoder.encode(userId, UTF-8); // 对参数值进行URL编码//步骤一创建URL对象URL url new URL(http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId userId);//步骤二打开连接HttpURLConnection conn (HttpURLConnection) url.openConnection();//步骤三设置请求方式conn.setRequestMethod(GET);//步骤四读取响应内容BufferedReader reader new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb new StringBuilder();String line;while ((line reader.readLine()) ! null) {sb.append(line);}reader.close();System.out.println(sb.toString());} Testpublic void doPost() throws IOException {//创建URL对象URL url new URL(http://127.0.0.1:8094/masterdata/sysUser/saveUser);//打开连接HttpURLConnection conn (HttpURLConnection) url.openConnection();//设置请求方式conn.setRequestMethod(POST);// 设置请求头conn.setRequestProperty(Content-Type, application/json);//启用输出流conn.setDoOutput(true);//设置请求体数据Map map new HashMap();map.put(name, 郭郭);String requestBody JSON.toJSONString(map);//发送请求体数据try (DataOutputStream outputStream new DataOutputStream(conn.getOutputStream())) {outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));}//读取响应内容BufferedReader reader new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb new StringBuilder();String line;while ((line reader.readLine()) ! null) {sb.append(line);}reader.close();System.out.println(sb.toString());} }使用OkHttp调用
1、引入依赖 !--okhttp依赖--dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.0.0/version/dependency2、示例代码 public class TestOkHttp {Testpublic void doGet() throws IOException {OkHttpClient client new OkHttpClient();String url http://127.0.0.1:8080/master/test/getSysUserById?userId郭郭;Request request new Request.Builder().url(url).build();try (Response response client.newCall(request).execute()) {ResponseBody body response.body();System.out.println(body.string());}}Testpublic void doPost() throws IOException{OkHttpClient client new OkHttpClient();String url http://127.0.0.1:8080/master/test/saveUser;MediaType mediaType MediaType.get(application/json; charsetutf-8);//requestBody请求入参Map map new HashMap();map.put(name, admin);RequestBody requestBody RequestBody.create(mediaType, JSON.toJSONString(map));Request request new Request.Builder().url(url).post(requestBody).build();try (Response response client.newCall(request).execute()) {ResponseBody body response.body();System.out.println(body.string());}}
}使用AsyncHttpClient调用
1、引入依赖
dependencygroupIdorg.asynchttpclient/groupIdartifactIdasync-http-client/artifactIdversion2.12.3/version
/dependency2、示例代码
public class TestAsyncHttpClient {Testpublic void doGet() throws IOException {try (AsyncHttpClient client new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder client.prepareGet(http://127.0.0.1:8080/master/test/getSysUserById?userIdhy001);CompletableFutureString future requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody future.join();System.out.println(responseBody);}}Testpublic void doPost() throws IOException {try (AsyncHttpClient client new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder client.preparePost(http://127.0.0.1:8094/8080/master/test/saveUser);//requestBody请求入参Map map new HashMap();map.put(name, admin);String requestBody JSON.toJSONString(map);requestBuilder.addHeader(Content-Type, application/json);requestBuilder.setBody(requestBody);CompletableFutureString future requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody future.join();System.out.println(responseBody);}}}