一、REST接口规范
REST(Representational State Transfer)即表述性状态转移,是一种设计风格,是现今被广泛应用的一种网络应用通信协议。RESTful 架构的 Web 服务即基于 REST 架构设计的WebService,它应该满足以下几个条件:
1. 客户端- 服务端:客户端和服务端之间的关系应当统一使用REST 接口,这样可以分离前后端开发。
2. 无状态:客户端向服务端请求的所有必要信息都必须包含在请求中,服务端不应该存储客户端的任何信息。
3. 可缓存:服务器必须明确哪些响应可以被缓存,而客户端需要明确它从上一个响应中已经取回的是什么。
4. 按需编码:服务器必须自己使用请求提供的内容来选择如何处理请求,不能假定客户端能够使用某种特定格式来请求数据或者提交数据。
5. 统一接口:所有的资源都通过 URI 暴露给客户端,同时使用标准的 HTTP 方法来定义缺少的操作。
@RestController
public class UserController {
// 获取用户列表
@GetMapping("/users")
public List
listUser() {
List
userList = userService.listUser();
return userList;
}
// 获取用户详情
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
User user = userService.getUserById(id);
return user;
}
}
二、REST接口为什么需要转义
在 REST 接口通信过程中,常常需要处理特殊字符如&、=等,这些特殊字符对URL参数传输和接收可能会造成影响,那么就需要对这些特殊字符进行转义。转义后的字符将会被替换成一些特殊字符序列,这些序列是可以被服务器和浏览器处理的。
// URL编码
String encode = URLEncoder.encode("Java 编程", "UTF-8");
System.out.println(encode); // Java+%E7%BC%96%E7%A8%8B
// URL解码
String decode = URLDecoder.decode("Java+%E7%BC%96%E7%A8%8B", "UTF-8");
System.out.println(decode); // Java 编程
三、REST接口测试是什么
REST 接口测试是一种测试手段,它主要用于测试 REST 接口是否符合预期结果。REST 接口测试主要包括接口功能测试、接口性能测试和接口安全测试。其中,功能测试主要关注接口是否按照要求运行;性能测试主要用于测试接口的吞吐量和响应时间;安全测试主要用于测试接口是否安全,是否存在漏洞。
常见的 REST 接口测试工具有 Postman、JMeter、SoapUI 等。
四、REST接口XML
XML 即可扩展标记语言(Extensible Markup Language),它是一种标记语言,用于表示数据。在 REST 接口中,XML 通常用于表示数据的传输格式。XML 的优点是可读性高,易于扩展。
1
张三
2
李四
五、REST接口传集合
在 REST 接口中,传递集合数据时,可以采用数组的方式或者JSON格式。JSON 格式比数组方式更加易于处理,因为 JSON 可以支持多维数组。
// 传递数组
@GetMapping("/users")
public List
listUser(@RequestParam("ids") Long[] ids) {
List
userList = userService.listUserByIds(ids);
return userList;
}
// 传递JSON
@PostMapping("/users")
public void addUser(@RequestBody List
userList) {
userService.addUser(userList);
}
六、REST接口协议
REST 接口通常使用 HTTPS 协议,它是隧道加密协议,可以保证数据传输过程中的安全性。HTTPS 是在 HTTP 的基础上添加了 SSL/TLS 层,实现了数据加密、身份验证和数据完整性校验。
@Configuration
public class HttpsConfig {
@Value("${server.ssl.key-store}")
private String keyStorePath;
@Value("${server.ssl.key-store-password}")
private String keyPassword;
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
// 配置HTTPS
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource(keyStorePath).getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass(keyPassword);
protocol.setKeyAlias("tomcat");
return connector;
} catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore" + "] or truststore: [" + "none"
+ "]", ex);
}
}
}
七、REST接口类型
在 REST 接口中,常用的数据类型有字符串、整型、浮点型、布尔型、时间类型、对象等。在传递对象时,通常使用 JSON 或 XML 格式,这样可以简化数据的处理。
// 传递对象
@PostMapping("/users")
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
八、REST接口标准文档
在 REST 接口开发过程中,通常需要编写接口标准文档,以便开发人员能够快速了解接口的使用方式和参数传递方式。接口标准文档应该包含接口说明、URL、请求方式、参数列表、返回值说明等内容。
/**
* 获取用户列表
* URL: /users
* Method: GET
* @param pageNum 页码
* @param pageSize 分页大小
* @return 用户列表
*/
@GetMapping("/users")
public List
listUser(@RequestParam("pageNum") Integer pageNum,
@RequestParam("pageSize") Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List
userList = userService.listUser();
PageInfo
pageInfo = new PageInfo<>(userList);
return pageInfo.getList();
}
九、REST接口array
在 REST 接口中,数组可以作为参数传递、作为返回结果,也可以作为参数中的某个属性值。数组在传递时,通常使用 URL 参数或者 JSON 格式。
// 传递参数数组
@GetMapping("/users")
public List
listUser(@RequestParam(value = "ids", required = false) Long[] ids) {
List
userList = userService.listUserByIds(ids);
return userList;
}
// 返回结果为数组
@GetMapping("/users")
public Long[] listUserId() {
Long[] userIds = userService.listUserId();
return userIds;
}
// 参数中包含数组
@PostMapping("/users")
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
十、REST接口和HTTP接口
REST 接口和 HTTP 接口都是用于提供服务的接口,但是有些区别。HTTP 接口通常使用 SOAP 协议进行数据传输,而 REST 接口使用 RESTful 架构实现,使用JSON或XML格式进行数据的传输。比较起来,REST 接口更加轻量、灵活,易于扩展和维护。
在实际开发中,可以根据具体需要选择使用 REST 接口或者 HTTP 接口。