zoukankan      html  css  js  c++  java
  • spring mvc实现restful

    restful它的核心是将所有的 Api 都理解为一个网络资源。把api映射成资源

    restful它的核心是将所有的 Api 都理解为一个网络资源。把api映射成资源

    把api映射成资源,把api映射成资源

    1.浏览器支持http delete/put方法,添加HiddenHttpMethodFilter过滤器,将url转换为http delete/put方法

    <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 -->
    37  <filter>
    38  <filter-name>HiddenHttpMethodFilter</filter-name>
    39  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    40  </filter>
    41
    42  <filter-mapping>
    43  <filter-name>HiddenHttpMethodFilter</filter-name>
    44  <servlet-name>springmvc</servlet-name>
    45  </filter-mapping>

    2.由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。

    3.对于SOAP Webservice和Restful Webservice的选择问题,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架构风格。

    4.是否使用REST就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易

    而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验用户等级,转账,事务处理等,这些往往并不容易简单的抽象为资源。

    5.REST核心是url和面向资源,url代替了原来复杂的操作方法。REST允许我们通过url设计系统

    6.使用REST的关键是如何抽象资源,抽象的越精确,对REST的应用越好。

    7.Http是应用协议而非传输协议

    这点在后面各大网站的API分析中有很明显的体现,其实有些网站已经走到了SOAP的老路上,说是REST的理念设计,其实是作了一套私有的SOAP协议,因此称之为REST风格的自定义SOAP协议。

    8.http://bbs.csdn.net/topics/390908212
    如果是非rest风格有可能是http://bbs.csdn.net/topics?tid=390908212

    9.

    四、路径(Endpoint)

    路径又称"终点"(endpoint),表示API的具体网址。

    在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

    举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

    • https://api.example.com/v1/zoos
    • https://api.example.com/v1/animals
    • https://api.example.com/v1/employees

    五、HTTP动词

    对于资源的具体操作类型,由HTTP动词表示。

    常用的HTTP动词有下面五个(括号里是对应的SQL命令)。

    • GET(SELECT):从服务器取出资源(一项或多项)。
    • POST(CREATE):在服务器新建一个资源。
    • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
    • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
    • DELETE(DELETE):从服务器删除资源

    例如:

    • GET /zoos:列出所有动物园
    • POST /zoos:新建一个动物园
    • GET /zoos/ID:获取某个指定动物园的信息
    • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
    • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
    • DELETE /zoos/ID:删除某个动物园
    • GET /zoos/ID/animals:列出某个指定动物园的所有动物
    • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

    六、过滤信息(Filtering)

    如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

    下面是一些常见的参数。

    • ?limit=10:指定返回记录的数量
    • ?offset=10:指定返回记录的开始位置。
    • ?page=2&per_page=100:指定第几页,以及每页的记录数。
    • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
    • ?animal_type_id=1:指定筛选条件

    参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。

    七、状态码(Status Codes)

    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

    • 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    • 204 NO CONTENT - [DELETE]:用户删除数据成功。
    • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    • 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

    八、错误处理(Error handling)

    如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

    十一、其他

    (1)API的身份认证应该使用OAuth 2.0框架。

    (2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

    RESTful目前只知道有这样一种提法,没见有强制性的要求什么样的才叫RESTful。也没见有什么框架帮你来实现RESTful(刚才搜一下,好像有框架,轻量级框架,没用过),我理解的RESTful是:
    1. 使用http协议;
    2. 使用GET POST PUT DELETE来区分请求操作的类别,但这不是必须的,你完全可以GET请求发来但请求的方法是删除一条数据,只是建议用这四种操作来区分;
    3. 可以把RESTful理解成远程方法调用,实际上就是面向服务编程(SOAP),访问远程一个服务,那个服务是用什么实现的怎么实现的你不用考虑,只要知道GET http://xxx/method/?arg0=1&arg1=2这样就能调用method方法传两个参数,拿到返回值,它比webservice更容易理解,更直观,也更轻量级;
    4. 尽量使用stateless,即无状态的请求,就是每个请求都与前后的请求无关,不保留每次请求的状态,即server端没有session的概念,但有时我们确实需要知道一组请求是来自同一个客户端的请求序列,一般用token传递的方式来实现;

    去读一下腾迅的或百度的openAPI,并且下载个腾讯的openAPI客户端,读一下示例代码或照着写一个程序,应该可以更多理解一下restful,这些openAPI一般是restful的,但restful也没有硬规范,所以他们实现时也不是严格的restful

    ResultFul推荐每个URL能操作具体的资源,而且能准确描述服务器对资源的处理动作,通常服务器对资源支持get/post/put/delete/等,用来实现资源的增删改查,但是通常用浏览器访问资源都是GET,增加都是POST,而修改和删除不能正确描述。

    比如xxxxx/user/1,我既要能表示我要找id为1的user,我还要能表示我能删掉id为1的user;

    xxxxx/user,我既要能表示添加一个user,又要能表示修改一个user;

    问题是现在的浏览器只支持post/get,它根本无法让服务器知道,我到底要查找user还是要删除User,要添加还是要修改user。

    所以第三方框架为了实现这种效果而做了特定的规则去模拟实现,比如spring就用了

    <filter> 
      <filter-name>HiddenHttpMethodFilter</filter-name> 
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
    </filter> 
    这么个filter来模拟实现,以支持更多的http操作(put,delete),当我需要修改一个user的时候,只需要在<form>中加入<input type="hidden" name="_method" value="PUT">,这样提交这个表单的时候spring会知道这是要修改一个user。

    11.

    java做RESTful Web Service(API)如何解决验证的问题 

    由于restful web service是stateless无状态的,这样如何才能进行使用者的身份验证呢?

  • 相关阅读:
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    计算与软件工程 作业六
    计算与软件工程 作业五
    计算与软件工程 作业四
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程 作业一
    第六次作业
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5866070.html
Copyright © 2011-2022 走看看