1 介绍
REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格的名词。REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web 服务,包括使用不同语言编写的客户端如何通过 HTTP处理和传输资源状态。
为什么称为 REST?Web本质上由各种各样的资源组成,资源由URI 唯一标识。浏览器(或者任何其它类似于浏览器的应用程序)将展示出该资源的一种表现方式,或者一种表现状态。如果用户在该页面中定向到指向其它资源的链接,则将访问该资源,并表现出它的状态。这意味着客户端应用程序随着每个资源表现状态的不同而发生状态转移,也即所谓REST。
2 示例
2.1 依赖引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
2.2 application.yml
server:
port: 9000
servlet:
context-path: /
2.3 准备
为了方便测试,需要准备一个Web项目,我这边准备使用之前的项目,参考链接:https://blog.csdn.net/qq_41520636/article/details/119989972
2.4 配置
package com.hikktn.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* RestTemplate配置
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// 超时设置
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}
}
2.5 返回类
package com.hikktn.domain;
public class ResponseCode {
private int code;
private String message;
private Object data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public ResponseCode() {
}
public ResponseCode(int code, Object data) {
this.code = code;
this.data = data;
}
public ResponseCode(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
}
2.6 控制器
package com.hikktn.controller;
import com.alibaba.fastjson.JSONObject;
import com.hikktn.domain.ResponseCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("getGroovyData")
@ResponseBody
public ResponseCode getGroovyData() {
/**
* getForObject
*
* 参数1 要请求的地址的url 必填项
* 参数2 响应数据的类型 是String 还是 Map等 必填项
* 参数3 请求携带参数 选填
*
* getForObject 方法的返回值就是 被调用接口响应的数据
*/
String result = restTemplate.getForObject("http://localhost:8080/todo/getAll", String.class);
return new ResponseCode(200, "ok!", result);
}
@GetMapping("getGroovyByIdForData")
@ResponseBody
public ResponseCode getGroovyByIdForData(@RequestParam("id") Integer id) {
String result = restTemplate.getForObject("http://localhost:8080/todo/getById?todoId={1}", String.class, id);
return new ResponseCode(200, "ok!", result);
}
@GetMapping("getGroovyByIdForEntity")
@ResponseBody
public ResponseCode getGroovyByIdForEntity(@RequestParam("id") Integer id) {
/**
* getForEntity 方法
* 参数1 要请求的地址的url 必填项
* 参数2 响应数据的类型 是String 还是 Map等 必填项
* 参数3 请求携带参数 选填
*
* 返回值类型为 ResponseEntity
*
* 可以通过ResponseEntity 获取响应的数据,响应的状态码等信息
*/
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8080/todo/getById?todoId=" + id, String.class);
return new ResponseCode(response.getStatusCodeValue(), response.getBody());
}
@GetMapping("getGroovyByIdForMap")
@ResponseBody
public ResponseCode getGroovyByIdForMap(@RequestParam("id") Integer id) {
Map<String, Integer> map = new HashMap<>();
map.put("todoId", id);
String result = restTemplate.getForObject("http://localhost:8080/todo/getById?todoId={todoId}", String.class, map);
return new ResponseCode(200, "ok!", result);
}
@PostMapping(value = "saveGroovyForObject")
public ResponseCode saveGroovyForObject(@RequestBody JSONObject jsonObject) {
/**
* postForObject 返回值为响应的数据
* 参数1 要请求地址的url
* 参数2 通过LinkedMultiValueMap对象封装请求参数 模拟表单参数,封装在请求体中
* 参数3 响应数据的类型
*/
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), headers);
// LinkedMultiValueMap<String, Object> request = new LinkedMultiValueMap<>();
// request.set("task", task);
// request.set("isCompleted", isCompleted);
String result = restTemplate.postForObject("http://localhost:8080/todo/save", request, String.class);
return new ResponseCode(200, "ok!", result);
}
@PostMapping("saveGroovyForLocation")
public ResponseCode saveGroovyForLocation(@RequestBody JSONObject jsonObject){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), headers);
/**
* postForLocation 这个API和前两个都不一样
*
* 登录or注册都是post请求,而这些操作完成之后呢?大部分都是跳转到别的页面去了,这种场景下,就可以使用 postForLocation 了,提交数据,并获取返回的URI
* 响应参数要跳转的地址
*/
URI uri = restTemplate.postForLocation("http://localhost:8080/todo/save", request);
System.out.println(uri);
return new ResponseCode(200,uri);
}
@PutMapping("updateGroovyExchange")
public ResponseCode updateGroovyExchange(@RequestBody JSONObject jsonObject){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), headers);
ResponseEntity<String> result = restTemplate.exchange("http://localhost:8080/todo/update", HttpMethod.PUT, request, String.class);
return new ResponseCode(200,"ok!",result);
}
@DeleteMapping("deleteGroovy")
public ResponseCode deleteGroovy(@RequestParam("id") Integer id){
restTemplate.delete("http://localhost:8080/todo/del?todoId={todoId}",id);
return new ResponseCode(200,"ok!");
}
}
2.7 测试
2.7.1 getGroovyData方法
2.7.2 getGroovyByIdForData方法
2.7.3 getGroovyByIdForEntity方法
2.7.4 getGroovyByIdForMap方法
2.7.5 saveGroovyForObject方法
2.7.6 saveGroovyForLocation方法
2.7.7 updateGroovyExchange方法
2.7.8 deleteGroovy方法