restful三分钟彻底了解restful最佳实践(代码片段)

陈晓婵 陈晓婵     2022-12-14     788

关键词:

         REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准和协议;轻量级,跨平台,跨语言的架构设计;它是一种设计风格,不是一种标准,是一种思想

Rest架构的主要原则

     网络上的所有事物都被抽象为资源

    每个资源都有一个唯一的资源标识符

    同一个资源具有多种表现形式(xml,json等)

    对资源的各种操作不会改变资源标识符

    所有的操作都是无状态的

    符合REST原则的架构方式即可称为RESTful

什么是Restful:

        对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构).

为什么会出现Restful


在Restful之前的操作:
http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息

RESTful用法:
http://127.0.0.1/user/1 GET  根据用户id查询用户数据
http://127.0.0.1/user  POST 新增用户
http://127.0.0.1/user  PUT 修改用户信息
http://127.0.0.1/user  DELETE 删除用户信息

之前的操作是没有问题的,大神认为是有问题的,有什么问题呢?你每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save,其实完全没有这个必要,我使用了get请求,就是查询.使用post请求,就是新增的请求,我的意图很明显,完全没有必要做描述,这就是为什么有了restful.

如何使用:



SpringMVC实现restful服务:

SpringMVC原生态的支持了REST风格的架构设计

所涉及到的注解:

--@RequestMapping

---@PathVariable

---@ResponseBody

package cn.itcast.mybatis.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import cn.itcast.mybatis.pojo.User;
import cn.itcast.mybatis.service.NewUserService;

@RequestMapping("restful/user")
@Controller
public class RestUserController 

    @Autowired
    private NewUserService newUserService;

    /**
     * 根据用户id查询用户数据
     * 
     * @param id
     * @return
     */
    @RequestMapping(value = "id", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<User> queryUserById(@PathVariable("id") Long id) 
        try 
            User user = this.newUserService.queryUserById(id);
            if (null == user) 
                // 资源不存在,响应404
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
            
            // 200
            // return ResponseEntity.status(HttpStatus.OK).body(user);
            return ResponseEntity.ok(user);
         catch (Exception e) 
            e.printStackTrace();
        
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    

    /**
     * 新增用户
     * 
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<Void> saveUser(User user) 
        try 
            this.newUserService.saveUser(user);
            return ResponseEntity.status(HttpStatus.CREATED).build();
         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    

    /**
     * 更新用户资源
     * 
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.PUT)
    public ResponseEntity<Void> updateUser(User user) 
        try 
            this.newUserService.updateUser(user);
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
         catch (Exception e) 
            e.printStackTrace();
        
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    

    /**
     * 删除用户资源
     * 
     * @param user
     * @return
     */
    @RequestMapping(method = RequestMethod.DELETE)
    public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) 
        try 
            if (id.intValue() == 0) 
                // 请求参数有误
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
            
            this.newUserService.deleteUserById(id);
            // 204
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
         catch (Exception e) 
            e.printStackTrace();
        
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    




HTTP相应状态码:



总结:

restful就是旧技术,新风格.之前写过一篇关于restful接口的博客:【Restful接口】restful接口的两种使用方式

restful三分钟彻底了解restful最佳实践(代码片段)

     REST是英文representationalstatetransfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准和协议;轻量级,跨平台,跨语言的架构设计;它是一种设计风格,不是一种标准,是一... 查看详情

超长 URI 的 REST 最佳实践

...的查询。例如,我想查询具有许多个地理坐标的服务,以了解有关所有这些坐标的信息。1)我的第一个想法是使用长URI和servlet容器的increasethemaxURIlength。看起来像这样:GEThttp://some.te 查看详情

REST API 设计 - 最佳实践:链接现有子资源 [关闭]

...间】:2017-07-1304:38:28【问题描述】:在设计RESTAPI时,我了解如何添加(POST)、更新(PUT、PATCH)等实体。但我想知道如何设计端点以将现有项目添加到现有资源?这是一个示例:假设我们有一个API,其中包含资源Co 查看详情

restful最佳实践

https://blog.csdn.net/chenxiaochan/article/details/73716617      REST是英文representationalstatetransfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准 查看详情

restful最佳实践

哲学不要为了RESTful而RESTful在能表达清楚的情况下,简单就是美接口路径设计接口设计原则URI指向的是唯一的资源对象示例: 指向ID为yanbo.ai的Account对象GEThttp://~/$version/accounts/yanbo.aiURI可以隐式指向唯一的集合列表示例: 隐... 查看详情

RESTful 服务中部分更新的最佳实践

】RESTful服务中部分更新的最佳实践【英文标题】:BestpracticeforpartialupdatesinaRESTfulservice【发布时间】:2011-01-2710:49:20【问题描述】:我正在为客户管理系统编写一个RESTful服务,并试图找到部分更新记录的最佳实践。例如,我希望... 查看详情

RESTful API 错误最佳实践

】RESTfulAPI错误最佳实践【英文标题】:BestPracticeforErrorsinRESTfulAPI【发布时间】:2013-03-1401:52:54【问题描述】:在RESTfulAPI中返回HTTP状态代码的最佳做法是什么?我将Laravel4用于我的PHP框架。如果出现错误,我应该使用returnResponse::... 查看详情

通过 REST 发送大量数据 - 最佳实践

】通过REST发送大量数据-最佳实践【英文标题】:SendlargeamountofDATAviaREST-BestPractices【发布时间】:2011-10-1220:31:17【问题描述】:如何通过REST将大约100,000条记录从应用程序的一个部分发送到另一台服务器上该应用程序的另一部分... 查看详情

我们必须要知道的restful服务最佳实践(代码片段)

看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标准并不是很多,也没有必要。但是在实际... 查看详情

自定义 REST 服务的 API 身份验证最佳实践

】自定义REST服务的API身份验证最佳实践【英文标题】:APIAuthenticationbestpracticesforcustomRESTservice【发布时间】:2021-05-2417:46:55【问题描述】:我会尽量保持它与框架无关,但我会参考我个人使用的框架来提供一些上下文。另外,很... 查看详情

有限 REST API 的最佳实践

】有限RESTAPI的最佳实践【英文标题】:BestpracticesforlimitedRESTAPIs【发布时间】:2018-05-2500:34:11【问题描述】:你好***社区,我想构建一个使用足球数据的Android应用。我发现了一个通过RESTAPI提供足球信息的服务。该服务限制为5,000... 查看详情

Spring boot REST 令牌授权和认证最佳实践

】SpringbootREST令牌授权和认证最佳实践【英文标题】:SpringbootRESTtokenauthorizationandauthenticationbestpractices【发布时间】:2015-02-2310:35:06【问题描述】:RESTspringboot中用户授权和认证的最佳实践是什么?我正在使用标准页面+用于移动... 查看详情

如何创建一个包含另一个集合的 ObjectId 数组的文档(最佳实践,RESTful)?

】如何创建一个包含另一个集合的ObjectId数组的文档(最佳实践,RESTful)?【英文标题】:HowtocreateadocumentthatincludesanarrayofObjectIdsofanothercollection(best-practice,RESTful)?【发布时间】:2019-10-2205:19:58【问题描述】:使用Mongoose和RESTfulAPI... 查看详情

Django Rest Framework 和 Stripe,最佳实践?

】DjangoRestFramework和Stripe,最佳实践?【英文标题】:DjangoRestFrameworkandStripe,bestpractice?【发布时间】:2015-04-2812:04:39【问题描述】:我正在使用付款处理程序Stripe解决我的DRF结构中的哲学问题。我正在通过我的DRFRESTAPI销售具有djan... 查看详情

Spring Boot REST API 端点映射最佳实践

】SpringBootRESTAPI端点映射最佳实践【英文标题】:SpringBootRESTAPIEndpointMappingbestpractice【发布时间】:2018-12-0418:20:51【问题描述】:我正在使用以下端点URL映射和HTTP方法,例如(POST、DELETE、GET、PUT)POST创建新交易-@PostMapping("/tr... 查看详情

Java Web Service REST 正确设计最佳实践

】JavaWebServiceREST正确设计最佳实践【英文标题】:JavaWebserviceRESTproperdesignbestpracice【发布时间】:2011-09-0813:07:25【问题描述】:我用Java开发了一个web服务,它作为servlet在tomcat上运行,应用程序的参数通过get请求(例如servlet?method... 查看详情

使用 Paypal REST SDK 最佳实践进行单元/模拟测试

】使用PaypalRESTSDK最佳实践进行单元/模拟测试【英文标题】:Unit/MocktestingwithPaypalRESTSDKbestpractices【发布时间】:2019-02-1913:26:11【问题描述】:我正在使用PaypalRESTSDKforJava开发一个应用程序。我正在尝试为我的应用程序开发测试。... 查看详情

关于 RESTful API 的几个问题以及为啥很少实施一些最佳实践

】关于RESTfulAPI的几个问题以及为啥很少实施一些最佳实践【英文标题】:AfewquestionsaboutRESTfulAPIsandwhysomeofthebest-practicesarerarelyimplemented关于RESTfulAPI的几个问题以及为什么很少实施一些最佳实践【发布时间】:2012-04-2510:38:12【问题... 查看详情