SpringBoot调用外部接口的几种方式
使用FeignClient调用
FeignClient调用大多用于微服务开发中,各服务之间的接口调用。它以Java接口注解的方式调用HTTP请求,使服务间的调用变得简单
1、在使用方引入依赖
<!--Feign注解 这里openFeign的版本要和自己使用的SpringBoot匹配--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><!--<version>4.0.1</version>--></dependency>
2、服务接口调用方
2.1、在启动类上加上@EnableFeigncliens注解
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableFeignClientspublicclassStudyfeignApplication{publicstaticvoidmain(String[] args){SpringApplication.run(StudyfeignApplication.class, args);System.out.println("项目启动成功");}}
2.2、编写Feign接口调用服务controller层
importcom.hysoft.studyfeign.service.SysUserClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("feign")publicclassSysUserController{@AutowiredprivateSysUserClient sysUserClient;@PostMapping("getUserId")publicvoidgetUserId(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}")publicinterfaceSysUserClient{@PostMapping("/master/test")StringgetUserById(String id);}
application.yml中的配置如下
server:
port:8081
master-getuserbyId: http://localhost:8080
3、服务接口提供者
对于接口提供者来说没有特别要求,和正常的接口开发一样
4、说明
需要说明的是,在接口调用方,可以继续拓展service层,书写service实现层,进一步进行拓展
importorg.springframework.stereotype.Service;@ServicepublicclassSysUserClientImplimplementsSysUserClient{@OverridepublicStringgetUserById(String id){return"";}}
使用RestTemplate调用
RestTemplate中几个常用的方法:getForObject()、getForEntity()、postForObject()、postForEntity()。其中,getForObject() 和 getForEntity() 方法可以用来发送 GET 请求
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
2、RestTemplateConfig配置类
SimpleClientHttpRequestFactory类对应的HTTP库是JDK自带的HttpUrlConnection,当然我们可以根据自身的需求使用其他的HTTP库,例如HttpComponentsAsyncClientHttpRequestFactory
@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(ClientHttpRequestFactory factory){returnnewRestTemplate(factory);}@BeanpublicClientHttpRequestFactorysimpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory =newSimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//单位为ms
factory.setConnectTimeout(5000);//单位为msreturn factory;}}
3、接口调用
@RestControllerpublicclassTestRestTemplate{@ResourceprivateRestTemplate restTemplate;@GetMapping(value ="/saveUser")publicvoidsaveUser(String userId){String url ="http://127.0.0.1:8080/master/test";Map map =newHashMap<>();
map.put("userId","hy001");String results = restTemplate.postForObject(url, map,String.class);}}
使用WebClient调用
Spring3.0引入了RestTemplate,但是在后来的官方源码中介绍,RestTemplate有可能在未来的版本中被弃用,所谓替代RestTemplate,在Spring5中引入了WebClient作为异步的非阻塞、响应式的HTTP客户端。
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
2、接口调用示例
publicclassTestWebClient{@TestpublicvoiddoGet(){String userId ="郭郭";String url ="http://127.0.0.1:8080/master/test/getSysUserById?userId={userId}";Mono<String> mono =WebClient//创建WebClient实例.create()//方法调用,WebClient中提供了多种方法.get()//请求url.uri(url, userId)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果:block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println("响应结果:"+ mono.block());}@TestpublicvoiddoPost(){Map map =newHashMap<>();
map.put("name","郭郭");String requestBody =JSON.toJSONString(map);String url ="http://127.0.0.1:8080/master/test/saveUser";Mono<String> 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调用
publicclassTestHttpClient{@TestpublicvoiddoGet()throwsIOException{//步骤一:创建httpClient实例CloseableHttpClient httpClient =HttpClients.createDefault();//步骤二:创建HTTP请求HttpGet httpGet =newHttpGet("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和response
response.close();
httpClient.close();}@TestpublicvoiddoPost()throwsIOException{//步骤一:创建httpClient实例CloseableHttpClient httpClient =HttpClients.createDefault();//步骤二:创建HTTP请求HttpPost httpPost =newHttpPost("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//步骤三:设置请求体数据,使用JSON格式Map map =newHashMap<>();
map.put("name","郭郭");String requestBody =JSON.toJSONString(map);StringEntity stringEntity =newStringEntity(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和response
response.close();
httpClient.close();}}
使用HttpURLConnection调用
publicclassTestHttpURLConnection{@TestpublicvoiddoGet()throwsIOException{String userId ="郭郭";// 参数值
userId =URLEncoder.encode(userId,"UTF-8");// 对参数值进行URL编码//步骤一:创建URL对象URL url =newURL("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId="+ userId);//步骤二:打开连接HttpURLConnection conn =(HttpURLConnection) url.openConnection();//步骤三:设置请求方式
conn.setRequestMethod("GET");//步骤四:读取响应内容BufferedReader reader =newBufferedReader(newInputStreamReader(conn.getInputStream()));StringBuilder sb =newStringBuilder();String line;while((line = reader.readLine())!=null){
sb.append(line);}
reader.close();System.out.println(sb.toString());}@TestpublicvoiddoPost()throwsIOException{//创建URL对象URL url =newURL("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 =newHashMap<>();
map.put("name","郭郭");String requestBody =JSON.toJSONString(map);//发送请求体数据try(DataOutputStream outputStream =newDataOutputStream(conn.getOutputStream())){
outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));}//读取响应内容BufferedReader reader =newBufferedReader(newInputStreamReader(conn.getInputStream()));StringBuilder sb =newStringBuilder();String line;while((line = reader.readLine())!=null){
sb.append(line);}
reader.close();System.out.println(sb.toString());}}
使用OkHttp调用
1、引入依赖
<!--okhttp依赖--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.0.0</version></dependency>
2、示例代码
publicclassTestOkHttp{@TestpublicvoiddoGet()throwsIOException{OkHttpClient client =newOkHttpClient();String url ="http://127.0.0.1:8080/master/test/getSysUserById?userId=郭郭";Request request =newRequest.Builder().url(url).build();try(Response response = client.newCall(request).execute()){ResponseBody body = response.body();System.out.println(body.string());}}@TestpublicvoiddoPost()throwsIOException{OkHttpClient client =newOkHttpClient();String url ="http://127.0.0.1:8080/master/test/saveUser";MediaType mediaType =MediaType.get("application/json; charset=utf-8");//requestBody请求入参Map map =newHashMap<>();
map.put("name","admin");RequestBody requestBody =RequestBody.create(mediaType,JSON.toJSONString(map));Request request =newRequest.Builder().url(url).post(requestBody).build();try(Response response = client.newCall(request).execute()){ResponseBody body = response.body();System.out.println(body.string());}}}
使用AsyncHttpClient调用
1、引入依赖
<dependency><groupId>org.asynchttpclient</groupId><artifactId>async-http-client</artifactId><version>2.12.3</version></dependency>
2、示例代码
publicclassTestAsyncHttpClient{@TestpublicvoiddoGet()throwsIOException{try(AsyncHttpClient client =newDefaultAsyncHttpClient();){BoundRequestBuilder requestBuilder = client.prepareGet("http://127.0.0.1:8080/master/test/getSysUserById?userId=hy001");CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}@TestpublicvoiddoPost()throwsIOException{try(AsyncHttpClient client =newDefaultAsyncHttpClient();){BoundRequestBuilder requestBuilder = client.preparePost("http://127.0.0.1:8094/8080/master/test/saveUser");//requestBody请求入参Map map =newHashMap<>();
map.put("name","admin");String requestBody =JSON.toJSONString(map);
requestBuilder.addHeader("Content-Type","application/json");
requestBuilder.setBody(requestBody);CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}}
本文转载自: https://blog.csdn.net/qq_40386113/article/details/141223841
版权归原作者 one_smail 所有, 如有侵权,请联系我们删除。
版权归原作者 one_smail 所有, 如有侵权,请联系我们删除。