网络(11)-什么是RestFul风格?

RESTFUL是一种网络应用程序的设计风格和开发方式,是一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

Representational State Transfer 表现层状态转化( 资源定位及资源操作) ,表象层面说就是通过get,post,put,delete方式来实现前后台通信的一种轻量级,跨平台,跨语言架构设计风格的web服务。

一、设计规范

1、 每一个URI代表1种资源;
2、 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、 通过操作资源的表现形式来操作资源;
4、 资源的表现形式是XML或者HTML;
5、 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息;

二、应用范围

1.WebService

Java的 jax -rs规范约束了RESTful WebService的开发方式,而cxf3.0已经实现了jax-rs 的全套规范。

WebService接口代码举例,按如下风格定义的WebService接口就是遵循RESTful开发规范的:

@Path("/userservice/")
public interface IMyService {
  
  @Path("/addUser/")
  @POST
  Response addUser(User user);
  
  @Path("/delUser/{id}/")
  @DELETE
  Response delUser(@PathParam("id") String id);
  
  @Path("/updateUser/")
  @PUT
  Response updateUser(User user);
  
  @Path("/getUserById/{id}/")
  @GET
  @Produces("application/json")//返回json数据格式
  User getUserById(@PathParam("id") String id);
  
  @Path("/")
  @GET
  @Produces("application/json")//返回json数据格式
  List<User> findAllUsers();
}

2.Http调用

在定义请求地址时,可以按照RestFul的规范,当然不是强制性的,每个团队定义自己的标准即可,根据语义化,最好是完全按照规范来。这样前后端分离开发的时候,能减少很多不必要的沟通。

三、设计误区

RESTful架构有一些典型的设计误区。

最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

  • POST /accounts/1/transfer/500/to/2

正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

  • POST /transaction HTTP/1.1
  • Host: 127.0.0.1

from=1&to=2&amount=500.00

另一个设计误区,就是在URI中加入版本号:

1、 http://www.example.com/app/1.0/foo;
2、 http://www.example.com/app/1.1/foo;
3、 http://www.example.com/app/2.0/foo;

因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):

1、 Accept:vnd.example-com.foo+json;version=1.0;
2、 Accept:vnd.example-com.foo+json;version=1.1;
3、 Accept:vnd.example-com.foo+json;version=2.0;


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

 

参考资料:

1、 https://blog.csdn.net/qq_34218628/article/details/80696649

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: