您的位置:

REST接口详解

一、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 接口。