springboot使用RestTemplate实现远程调用服务

RestTemplate

        • 简介
      • 接口提供者环境准备
        • 1,application.yml
        • 2,提供接口,供以调用
      • 服务调用者环境准备
        • 1,导入所需依赖
        • 2,application.yml
        • 3,编写RestTemplateConfig
      • 代码示例及效果
        • 1,服务调用者接口示例
          • 请求:http://localhost:9013/user/test004 发送POST请求,添加用户
          • 请求:http://localhost:9013/user/test002 发送PUT请求,修改用户
          • 请求:http://localhost:9013/user/test001 发送GET请求,查询用户
          • 请求:http://localhost:9013/user/test003 发送DELETE请求,删除用户,参数以@RequestParam方式传递
          • 请求:http://localhost:9013/user/test005 发送GET请求,参数以@PathVariable方式传递

简介

spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如Apache HttpComponents、Netty或OkHttp等其它HTTP library。

其实spring并没有真正的去实现底层的http请求(3次握手),而是集成了别的http请求,spring只是在原有的各种http请求进行了规范标准,让开发者更加简单易用,底层默认用的是jdk的http请求。

首先咋门搭建两个服务,一个接口提供者,一个接口调用者

接口提供者环境准备

1,application.yml

server:
  port: 9005
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myqx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 1234

2,提供接口,供以调用

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserInfoService userInfoService;

    @GetMapping("/params/{id}")
    public String findAll(@PathVariable("id") Integer id) {
        System.out.println(id);
        return "myqxin";
    }

    @GetMapping("/get")
    public List<UserInfo> findAll() {
        List<UserInfo> result = userInfoService.findAll();
        return result;
    }

    @PutMapping("/update")
    public String updateUser(@RequestBody UserInfo userInfo) {
        userInfoService.updateUser(userInfo);
        return "修改成功";
    }

    @DeleteMapping("/delete")
    public String deletUser(@RequestParam Integer id) {
        userInfoService.deleteUser(id);
        return "删除成功";
    }

    @PostMapping("/add")
    public String add(@RequestBody UserInfo userInfo) {
        userInfoService.add(userInfo);
        System.out.println(userInfo);
        return "添加成功";
    }

}

我这里只暴露了配置和接口,细节上就是CURD的简单接口实现,不必关注,知道调通了就行

服务调用者环境准备

1,导入所需依赖

  <!-- restTemplate 远程调用 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>

2,application.yml

server:
  port: 9013

3,编写RestTemplateConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * @author: myqxin
 * @Desc:
 * @create: 2021-08-20 16:22
 **/
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
        httpRequestFactory.setConnectTimeout(30 * 3000);
        httpRequestFactory.setReadTimeout(30 * 3000);
        return new RestTemplate(httpRequestFactory);
    }

}

代码示例及效果

1,服务调用者接口示例

import com.myqxin.pojo.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


/**
 * @author: myqxin
 * @Desc:
 * @create: 2021-08-19 17:29
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 参数
     * @return
     */
    @GetMapping("/test005")
    public String params() {
        Integer id = 3;
        ResponseEntity<String> exchange = this.restTemplate.exchange(String.format("http://localhost:9005/user/params/%s",id), HttpMethod.GET, null, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        String body = exchange.getBody();
        System.out.println(statusCodeValue);
        System.out.println(body);
        return "myqxin";
    }

    /**
     * 添加
     * @return
     */
    @GetMapping("/test004")
    public String add() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("myqxin");
        userInfo.setPassword("1234");
        userInfo.setAge(20);
        HttpEntity httpEntity = new HttpEntity(userInfo);
        ResponseEntity<String> exchange = this.restTemplate.exchange("http://localhost:9005/user/add", HttpMethod.POST, httpEntity, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        String body = exchange.getBody();
        System.out.println(statusCodeValue);
        System.out.println(body);
        return "myqxin";
    }

    /**
     * 删除
     * @return
     */
    @GetMapping("/test003")
    public String delete() {
        Integer id = 4;
        ResponseEntity<String> exchange = this.restTemplate.exchange("http://localhost:9005/user/delete?id="+id, HttpMethod.DELETE, null, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        String body = exchange.getBody();
        System.out.println(statusCodeValue);
        System.out.println(body);
        return "myqxin";
    }

    /**
     * 修改
     * @return
     * @throws Exception
     */
    @GetMapping("/test002")
    public String update() throws Exception {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(4);
        userInfo.setUsername("myqxin");
        userInfo.setPassword("123456");
        userInfo.setAge(18);
        HttpEntity httpEntity = new HttpEntity(userInfo);
        ResponseEntity<String> exchange = this.restTemplate.exchange("http://localhost:9005/user/update", HttpMethod.PUT, httpEntity, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        String body = exchange.getBody();
        System.out.println(statusCodeValue);
        System.out.println(body);
        return "myqxin";
    }

    /**
     * 查询
     * @return
     */
    @GetMapping("/test001")
    public String get() {
        /**
         * url: 请求地址;
         * method: 请求类型(如:POST,PUT,DELETE,GET);
         * requestEntity: 请求实体,封装请求头,请求内容
         * responseType: 响应类型,根据服务接口的返回类型决定
         * uriVariables: url中参数变量值
         */
        ResponseEntity<String> exchange = this.restTemplate.exchange("http://localhost:9005/user/get", HttpMethod.GET, null, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        String body = exchange.getBody();
        System.out.println(statusCodeValue);
        System.out.println(body);
        return "myqxin";
    }

}
请求:http://localhost:9013/user/test004 发送POST请求,添加用户

springboot使用RestTemplate实现远程调用服务_第1张图片
springboot使用RestTemplate实现远程调用服务_第2张图片

请求:http://localhost:9013/user/test002 发送PUT请求,修改用户

springboot使用RestTemplate实现远程调用服务_第3张图片

请求:http://localhost:9013/user/test001 发送GET请求,查询用户

springboot使用RestTemplate实现远程调用服务_第4张图片

请求:http://localhost:9013/user/test003 发送DELETE请求,删除用户,参数以@RequestParam方式传递

springboot使用RestTemplate实现远程调用服务_第5张图片

请求:http://localhost:9013/user/test005 发送GET请求,参数以@PathVariable方式传递

springboot使用RestTemplate实现远程调用服务_第6张图片

你可能感兴趣的:(#,java,后端,java)