RESTful Web API介绍

框架设计原理与实战:RESTful API与Web服务 1.背景介绍 一、什么是API? API(Application Programming Interface),即应用程序编程接口。它是两个或以上软件模块之间交流信息的一种方式。通过提供的接口,外部软件可以访问由其他软件提供的某项功能或数据,从而实现各种各样的功能,如查询天气预报,网上银行业务等。API分 阅读详情

《我所理解的RESTful Web API [Web标准篇]》Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建。构建REST风格的Web服务是最近两三年风行的潮流,所以很多人以为REST是一个事物。而事实却是:REST自其诞生之日起到现在(2014年)已经有14年了,它为什么叫这么一个“奇怪”的名字呢?

目录 
一、为什么叫这个“奇怪”的名字?二、采用URI标识资源 
二、采用URI标识资源 
三、使用“链接”关联相关的资源 
四、使用统一的接口 
五、使用标准的HTTP方法 
六、支持多种资源表示方式 
七、无状态性

一、为什么叫这个“奇怪”的名字?

2000年,Roy Thomas Fielding博士在他那篇著名的博士论文《Architectural Styles and the Design of Network-based Software Architectures》中提出了几种软件应用的架构风格,REST作为其中的一种架构风格在这篇论文的第5章中进行了概括性的介绍。我个人建议本书的读者都能读读这篇论文,原文和中文译文都可以从网络上找到。

REST是“REpresentational State Transfer”的缩写,可以翻译成“表现状态转换”,但是在绝大多数场合中我们只说REST或者RESTful。为什么会起这么一个奇怪的名字呢?我们可以从上述这篇论文中找到答案。Fielding在论文中将REST定位为“分布式超媒体应用(Distributed Hypermedia System)”的架构风格,它在文中提到一个名为“HATEOAS(Hypermedia as the engine of application state)”的概念。

我们利用一个面向最终用户的Web应用来对这个概念进行简单阐述:这里所谓的应用状态(Application State)表示Web应用的客户端的状态,简单起见可以理解为会话状态。资源在浏览器中以超媒体的形式呈现,通过点击超媒体中的链接可以获取其它相关的资源或者对当前资源进行相应的处理,获取的资源或者针对资源处理的响应同样以超媒体的形式再次呈现在浏览器上。由此可见,超媒体成为了驱动客户端会话状态的转换的引擎。

借助于超媒体这种特殊的资源呈现方式,应用状态的转换体现为浏览器中呈现资源的转换。如果将超媒体进一步抽象成一般意义上的资源呈现(Representation )方式,那么应用状态变成了可被呈现的状态(REpresentational State)。应用状态之间的转换就成了可被呈现的状态装换(REpresentational State Transfer),这就是REST。

REST在我看来是一种很笼统的概念,它代表一种架构风格。对于多个Web应用采用的架构,我们只能说其中某一个比其它的更具有REST风格,而不能简单粗暴地说:“它采用了REST架构而其它的没有”。为了将REST真正地落地,Lenoard Rechardson & Sam Ruby在《RESTful Web Services》一书中提出了一种名为“面向资源的架构(ROA: Resource Oriented Architecture)”。该书中介绍了一些采用ROA架构的Web服务应该具备的基本特征,它们可以指导我们如果构架具体的RESTful Web API。

二、采用URI标识资源

SOAP Web API采用RPC风格,它采用面向功能的架构,所以我们在设计SOAP Web API的时候首相考虑的是应高提供怎样的功能(或者操作)。RESTful Web API采用面向资源的架构,所以在设计之初首先需要考虑的是有哪些资源可供操作。

资源是一个很宽泛的概念,任何寄宿于Web可供操作的“事物”均可视为资源。资源可以体现为经过持久化处理保存到磁盘上的某个文件或者数据库中某个表的某条记录,也可以是Web应用接受到请求后采用某种算法计算得出的结果。资源可以体现为一个具体的物理对象,它也可以是一个抽象的流程。

一个资源必须具有一个或者多个标识,既然我们设计的Web API,那么很自然地应该采用URI来作为资源的标识。作为资源标识的URI最好具有“可读性”,因为具有可读性的URI更容易被使用,使用者一看就知道被标识的是何种资源,比如如下一些URI就具有很好的可读性。

  • http://www.artech.com/employees/c001(编号C001的员工)
  • http://www.artech.com/sales/2013/12/31(2013年12月31日的销售额)
  • http://www.artech.com/orders/2013/q4(2013年第4季度签订的订单)

除了必要的标志性和可选的可读性之外,标识资源的URI应该具有“可寻址性(Addressability)”。也就是说,URI不仅仅指明了被标识资源所在的位置,而且通过这个URI可以直接获取目标资源。通过前面的介绍 我们知道URI具有URL和URN两种主要的表现形式,只要前者具有可寻址性,所以我们最好采用一个URL作为资源的标识。

URI除了可以标识某个独立的资源外(比如“http://www.artech.com/employees/c001”),还可以标识一组资源的集合或者资源的容器(比如“http://www.artech.com/orders/2013/q4”)。当然,一组同类资源的集合或者存放一组同类资源的容器本身也可以视为另一种类型的复合型(Composite)资源,所以“URI总是标识某个资源”这种说法是没有问题的。

三、使用“链接”关联相关的资源

在绝大多数情况下,资源并不会孤立地存在,必然与其它资源具有某种关联。既然我们推荐资源采用具有可寻址性的URL来标识,那么我们就可以利用它来将相关的资源关联起来。比如我们采用XML来表示一部电影的信息,那么我们采用如下的形式利用URL将相关的资源(导演、领衔主演、主演、编剧以及海报)关联在一起。实际上这可以视为一份超文本/超媒体文档。当用户得到这样一份文档的时候,可以利用自身的内容获得某部影片基本的信息,还可以利用相关的“链接”得到其它相关内容的详细信息。

   1: <movie>
   2:   <name>魔鬼代言人</name>
   3:   <genre>剧情|悬疑|惊悚</genre>
   4:   <directors>
   5:     <add ref="http://www.artech.com/directors/taylor-hackford">泰勒.海克福德</add>
   6:   </directors>
   7:   <starring>
   8:     <add ref = "http://www.artech.com/actors/al-pacino">阿尔.帕西诺</add>
   9:     <add ref = "http://www.artech.com/actors/keanu-reeves ">基诺.李维斯</add>
  10:   </starring>
  11:   <supportingActors>
  12:     <add ref = "http://www.artech.com/actors/charlize-theron ">查理兹.塞隆</add>
  13:     <add ref = "http://www.artech.com/actors/jeffrey-jones ">杰弗瑞.琼斯</add>  
  14:     <add ref = "http://www.artech.com/actors/connie-nielsen">康尼.尼尔森</add>  
  15:   </supportingActors>
  16:   <scriptWriters>
  17:     <add ref = "http://www.artech.com/scriptwriters/jonathan-lemkin">乔纳森•莱姆金</add>
  19:     <add ref = "http://www.artech.com/scriptwriters/tony-gilroy">托尼•吉尔罗伊 </add>  
  20:   </scriptWriters>
  21:   <language>英语</language>
  22:   <poster ref = "http://www.artech.com/images/the-devil-s-advocate"/>
  23:   <story>...</story>
  24: </movie>

Fielding在他的论文中将REST定位为“分布式超媒体应用”的架构风格,而超媒体的核心就是利用“链接”相关的信息结成一个非线性的网,所以从一点也可以看出REST和“使用链接关联相关的资源”这个特性使吻合的。

四、使用统一的接口

由于REST是面向资源的,所以一个Web API旨在实现针对单一资源的操作。我们在前面已经说个,针对资源的基本操作唯CRUD而已,这是使我们可以为Web API定义标准接口成可能。所谓的标准接口就是针对不同资源的Web API定义一致性的操作来操作它们,其接口可以采用类似于下面的模式。

   1: public class ResourceService
   2: {
   3:     public IEnumerable<Resource>[] Get();
   4:     public void Create(Resource resource);
   5:     public void Update(Resource resource);
   6:     public void Delete(string id);
   7: }

能否采用统一接口是RESTful Web API和采用RPC风格的SOAP Web服务又一区别。如果采用RPC风格的话,我们在设计Web API的时候首先考虑的是具体哪些功能需要被提供,所以这样的Web API是一组相关功能的集合而已。

以一个具体的场景为例。现在我们需要设计一个Web API来管理用于授权的角色,它只需要提供针对角色本身的CRUD的功能以及建立/解除与用户名之间的映射关系。如果我们将其定义成针对SOAP的Web服务,其服务接口具有类似于如下的结构。

   1: public class RoleService
   2: {
   3:     public IEnumerable<string> GetAllRoles();
   4:     public void CreateRole(string roleName);
   5:     public void DeleteRole(string roleName);
   6:  
   7:     public void AddRolesInUser(string userName, string[] roleNames);
   8:     public void RemoveRolesFromUser(string userName, string[] roleNames);
   9: }

如下我们需要将其定义成一个纯粹的RESTful的Web API,只有前面三个方法在针对角色的CRUD操作范畴之内,但是后面两个方法却可以视为针对“角色委派(Role Assignment)”对象的添加和删除操作。所以这里实际上涉及到了两种资源,即角色和角色委派。为了使Web API具有统一的接口,我们需要定义如下两个Web API。

   1: public class RolesService
   2: {
   3:     public IEnumerable<string> Get();
   4:     public void Create(string roleName);
   5:     public void Delete(string roleName);
   6: }
   7:  
   8: public class RoleAssignmentsService
   9: {
  10:     public void Create(RoleAssignment roleName);
  11:     public void Delete(RoleAssignment roleName);
  12: }

 

五、使用标准的HTTP方法

由于RESTful Web API采用了同一的接口,所以其成员体现为针对同一资源的操作。对于Web来说,针对资源的操作通过HTTP方法来体现。我们应该将两者统一起来,是Web API分别针对CRUD的操作只能接受具有对应HTTP方法的请求。

我们甚至可以直接使用HTTP方法名作为Web API接口的方法名称,那么这样的Web API接口就具有类似于如下的定义。对于ASP.NET Web API来说,由于它提供了Action方法名称和HTTP方法的自动映射,所以如果我们采用这样的命名规则,就无需再为具体的Action方法设定针对HTTP方法的约束了。

   1: public class ResourceService
   2: {
   3:     public IEnumerable<Resource>[] Get();
   4:     public void Post(Resource resource); 
   5:     public void Put(Resource resource);
   6:     public void Patch (Resource resource);
   7:     public void Delete(string id);
   8:  
   9:     public void Head(string id);
  10:     public void Options();
  11: }

上面代码片断提供的7个方法涉及到了7个常用的HTTP方法,接下来我们针对资源操作的语义对它们作一个简单的介绍。首先GET、HEAD和OPTIONS这三个HTTP方法旨在发送请求以或者所需的信息。对于GET,相应所有人对它已经非常熟悉了,它用于获取所需的资源,服务器一般讲对应的资源置于响应的主体部分返回给客户端。

HEAD和OPTIONS相对少见。从资源操作的语义来讲,一个针对某个目标资源发送的HEAD请求一般不是为了获取目标资源本身的内容,而是得到描述目标资源的元数据信息。服务器一般讲对应资源的元数据置于响应的报头集合返回给客户端,这样的响应一般不具有主体部分。OPTIONS请求旨在发送一种“探测”请求以确定针对某个目标地址的请求必须具有怎样的约束(比如应该采用怎样的HTTP方法以及自定义的请求报头),然后根据其约束发送真正的请求。比如针对“跨域资源”的预检(Preflight)请求采用的HTTP方法就是OPTIONS。

至于其它4中HTTP方法(POST、PUT、PATCH和DELETE),它们旨在针对目标资源作添加、修改和删除操作。对于DELETE,它的语义很明确,就是删除一个已经存在的资源。我们着重推荐其它三个旨在完成资源的添加和修改的HTTP方法作一个简单的介绍。

通过发送POST和PUT请求均可以添加一个新的资源,但是两者的不同之处在于:对于前者,请求着一般不能确定标识添加资源最终采用的URI,即服务端最终为成功添加的资源指定URI;对于后者,最终标识添加资源的URI是可以由请求者控制的。也正是因为这个原因,如果发送PUT请求,我们一般直接将标识添加资源的URI作为请求的URI;对于POST请求来说,其URI一般是标识添加资源存放容器的URI。

比如我们分别发送PUT和POST请求以添加一个员工,标识员工的URI由其员工ID来决定。如果员工ID由客户端来指定,我们可以发送PUT请求;如果员工ID由服务端生成,我们一般发送POST请求。具体的请求与下面提供的代码片断类似,可以看出它们的URI也是不一样的。

   1: PUT http://www.artech.com/employees/300357 HTTP/1.1
   2: ...
   3:  
   4: <employee>
   5:   <id>300357</id> 
   6:   <name>张三</name>
   7:   <gender>男<gender>
   8:   <birthdate>1981-08-24</birthdate>
   9:   <department>3041</department>
  10: </employee>
 
   1: POST http://www.artech.com/employees HTTP/1.1
   2: ...
   3:  
   4: <employee>
   5:   <name>张三</name>
   6:   <gender>男<gender>
   7:   <birthdate>1981-08-24</birthdate>
   8:   <department>3041</department>
   9: </employee>

POST和PUT请求一般将所加资源的内容置于请求的主体。但是对于PUT请求来说,如果添加资源的内容完全可以由其URI来提供,这样的请求可以不需要主体。比如我们通过请求添加一个用于控制权限的角色,标识添加角色的URI由其角色名称来决定,并且不需要指定除角色名称的其它信息,那么我们只要发送如下一个不含主体的PUT请求即可。

   1: PUT http://www.artech.com/roles/admin HTTP/1.1
   2:  
   3: ...

除了进行资源的添加,PUT请求还能用于资源的修改。由于请求包含提交资源的标识(可以放在URI中,也可以置于保存在主体部分的资源内容中),所以服务端能够定位到对应的资源予以修改。对于POST和PUT,也存在一种一刀切的说法:POST用于添加,PUT用于修改。我个人比较认可的是:如果PUT提供的资源不存在,则做添加操作,否则做修改。

对于发送PUT请求以修改某个存在的资源,服务器一般会将提供资源将原有资源整体“覆盖”掉。如果需要进行“局部”修改,我们推荐请求采用PATCH方法,因为从语义上讲“Patch”就是打补丁的意思。

安全性与幂等性

关于HTTP请求采用的这些个方法,具有两个基本的特性,即“安全性”和“幂等性”。对于上述7种HTTP方法,GET、HEAD和OPTIONS均被认为是安全的方法,因为它们旨在实现对数据的获取,并不具有“边界效应(Side Effect[1])”。至于其它4个HTTP方法,由于它们会导致服务端资源的变化,所以被认为是不安全的方法。

幂等性(Idempotent)是一个数学上的概念,在这里表示发送一次和多次请求引起的边界效应是一致的。在网速不够快的情况下,客户端发送一个请求后不能立即得到响应,由于不能确定是否请求是否被成功提交,所以它有可能会再次发送另一个相同的请求,幂等性决定了第二个请求是否有效。

上述3种安全的HTTP方法(GET、HEAD和OPTIONS)均是幂等方法。由于DELETE和PATCH请求操作的是现有的某个资源,所以它们是幂等方法。对于PUT请求,只有在对应资源不存在的情况下服务器才会进行添加操作,否则只作修改操作,所以它也是幂等方法。至于最后一种POST,由于它总是进行添加操作,如果服务器接收到两次相同的POST操作,将导致两个相同的资源被创建,所以这是一个非幂等的方法。

当我们在设计Web API的时候,应该尽量根据请求HTTP方法的幂等型来决定处理的逻辑。由于PUT是一个幂等方法,所以携带相同资源的PUT请求不应该引起资源的状态变化,如果我们在资源上附加一个自增长的计数器表示被修改的次数,这实际上就破坏了幂等型。

不过就我个人的观点来说,在有的场合下针对幂等型要求可以不需要那么严格。举个例子,我对于我们开发的发部分应用来说,数据表基本上都有一个名为LastUpdatedTime的字段表示记录最后一次被修改的时间,因为这是为了数据安全审核(Auditing)的需要。在这种情况下,如果接收到一个基于数据修改的PUT请求,我们总是会用提交数据去覆盖现有的数据,并将当前服务端时间(客户端时间不可靠)作为字段LastUpdatedTime的值,这实际上也破坏了幂等性。

可能有人说我们可以在真正修改数据之前检查提交的数据是否与现有数据一致,但是在涉及多个表链接的时候这个“预检”操作会带来性能损失,而且针对每个字段的逐一比较也是一个很繁琐的事情,所以我们一般不作这样的预检操作。

六、支持多种资源表示方式

资源和资源的表示(Representaion)是两个不同的概念,资源本身是一个抽象的概念,是看不见摸不着的,而看得见摸得着的是资源的表现。比如一个表示一个财年销售情况的资源,它既可以表示为一个列表、一个表格或者是一个图表。如果采用图表,又可以使用柱状图、K线图和饼图等,这一切都是针对同一个资源的不同表示。

我们说“调用Web API获取资源”,这句话其实是不正确的,因为我们获取的不是资源本身,仅仅是资源的某一种表示而已。对于Web来说,目前具有两种主流的数据结构,XML和JSON,它们也是资源的两种主要的呈现方式。在多语言环境下,还应该考虑描述资源采用的语言。

我们在设计Web API的时候,应该支持不同的资源表示,我们不能假定请求提供的资源一定表示成XML,也不能总是以JSON格式返回获取的资源,正确的做法是:根据请求携带的信息识别提交和希望返回的资源表示。对于请求提交的资源,我们一般利用请求的Content-Type报头携带的媒体类型来判断其采用的表示类型。对于响应资源表示类型的识别,可以采用如下两种方式。

  • 让请求URI包含资源表示类型,这种方式使用的最多的是针对多语言的资源,我们一般讲表示语言(也可以包含地区)的代码作为URI的一部分,比如“http://www.artech.com/en/orders/2013”表示将2013年的订单以英文的形式返回。
  • 采用“内容协商(Content Negotiation)”根据请求相关报头来判断它所希望的资源表示类型,比如“Accept”和“Accept-language”报头可以体现请求可以接受的响应媒体类型和语言。

对于上述两种资源表示识别机制,我们很多人会喜欢后者,因为第一种不够“智能”。实际上前者具有一个后者不具有的特性:“浏览器兼容型”[2]。对于Web API开发来说,浏览器应该成为一种最为常用的测试工具。在不借助任何插件的情况下,我们利用浏览器访问我们在地址栏中输入的URI时对生成的请求内容不能作任何干预的,如果与资源表示相关的信息(比如语言、媒体类型)被直接包含到请求的URI中,那么所有的情况都可以利用浏览器直接测试。

有人从另一方面对“URI携带资源表示类型”作了这样的质疑:由于URI是资源的标识,那么这导致了相同的资源具有多个标识。其实这是没有问题的,URI是资源的唯一标识,但不是其“唯一的唯一标识“,相同的资源可以具有多个标识。

七、无状态性

RESTful只要维护资源的状态,而不需要维护客户端的状态。对于它来说,每次请求都是全新的,它只需要针对本次请求作相应的操作,不需要将本次请求的相关信息记录下来以便用于后续来自相同客户端请求的处理。

对于上面我们介绍的RESTful的这些个特性,它们都是要求我们为了满足这些特征做点什么,唯有这个无状态却是要求我们不要做什么,因为HTTP本身就是无状态的。举个例子,一个网页通过调用Web API分页获取符合查询条件的记录。一般情况下,页面导航均具有“上一页”和“下一页”链接用于呈现当前页的前一页和后一页的记录。那么现在有两种实现方式返回上下页的记录。

  • Web API不仅仅会定义根据具体页码的数据查询定义相关的操作,还会针对“上一页”和“下一页”这样的请求定义单独的操作。它自身会根据客户端的Session ID对每次数据返回的页面在本地进行保存,以便能够知道上一页和下一页具体是哪一页。
  • Web API只会定义根据具体页码的数据查询定义相关的操作,当前返回数据的页码由客户端来维护。

第一种貌似很“智能”,其实就是一种画蛇添足的作法,因为它破坏了Web API的无状态性。设计无状态的Web API不仅仅使Web API自身显得简单而精炼,还因减除了针对客户端的“亲和度(Affinty)”使我们可以有效地实施负载均衡,因为只有这样集群中的每一台服务器对于每个客户端才是等效的。


[1] 大部分计算机书籍都将Side Effect翻译成“副作用”,而我们一般将“副(负)作用”理解为负面的作用,其实计算机领域Side Effect表示的作用无所谓正负,所以我们觉得还是还原其字面的含义“边界效用”。除此之外,对于GET、HEAD和OPTIONS请求来说,如果服务端需要对它们作日志、缓存甚至计数操作,严格来说这也算是一种Side Effect,但是请求的发送者不对此负责。

[2] 这里的“兼容”不是指支持由浏览器发送的请求,因为通过执行JavaScript脚本可以让作为宿主的浏览器发送任何我们希望的请求,这里的兼容体现在尽可能地支持浏览器访问我们在地址栏中输入的URI默认发送的HTTP-GET请求。

参考资料: 
[1] 《HTTP: The Definitive Guide》, By By David Gourley, Brian Totty, Marjorie Sayer, Anshu Aggarwal, Sailu Reddy 
[2] 《RESTful Web Services》, RESTful Web Services 
[3] 《A Brief Introduction to REST》,http://www.infoq.com/articles/rest-introduction 
[4] 《TCP/IP Illustrated (Volumn 1: The Protocol)》, by W. Richard Stevens

什么是 SAPGUI 里的 Logon Group/Server 这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。 阅读详情

相关推荐

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

RESTful web API

一、REST名称的由来 REST是"Representational State TRansfer"的缩写,可以翻译为"表现状态转换",可以简单称为REST或者RESTful。 REST是一种“分布式超媒体应用(Distributed Hypermedia System)”的架构风格。 Hypermedia as the engine of application state 这里的应用状态 application state表示web应用的客户端状态。简单理解为会话状态。资源在浏览器中以超媒体形式呈现,通

BestpayTech的博客 800

Win11系统下Abaqus 2025子程序开发环境一站式配置指南

本文详细介绍了在Win11系统下配置Abaqus 2025子程序开发环境的完整流程,包括VS2022和Intel oneAPI的安装与优化,以及Abaqus 2025的目录规划与环境联调。通过避坑指南和实战案例,帮助用户高效完成开发环境配置,避免常见错误,提升工作效率。

weixin_28717431的博客 333

Web API 、Restful的好处、 微服务 学习总结

1、定义:常规的WEB API就是指使用HTTP协议通过网络调用的API; 其实就是一个WEB系统,对外提供给别人调用的API,这种调用通常是程序的方式,而不是简简单单的浏览器中输入URL访问。 像我们常规使用的WEB Service、c#的一般处理程序、WCF都属于WEB API、以及Java中的响应Ajax的Servlet都算是web api 2、使用原生H...

u010133378的专栏 2168

怀旧党必备!用iPhone4s重温iOS6的保姆级教程(含游戏资源包)

本文提供了一份详细的iPhone4s降级至iOS6.1.3的保姆级教程,包括设备准备、越狱操作、系统降级及资源优化全流程。通过自制固件和越狱工具,用户可以重温经典的拟物化设计和流畅体验,同时获取经典游戏资源包,打造复古游戏神器。

nft7creator的博客 880

btstack ble ota开发笔记(2)-mcuboot移植

紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起

weixin_38177846的博客 2350

解释 RESTful API,以及如何使用它构建 web 应用程序

总的来说,使用RESTful API构建web应用程序要定义资源、设计HTTP方法、实现处理程序、返回响应、考虑安全性、提供文档和版本控制,并进行测试和部署等步骤。2. 设计HTTP方法:根据资源的操作类型,选择合适的HTTP方法进行定义,如GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源等。4. 返回响应:处理程序根据客户端请求的结果,返回相应的HTTP状态码和响应数据,如成功的响应可返回200状态码,错误的响应可返回400或500状态码。

qq_53976875的博客 638

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

什么是RESTful API?

        提到RESTful API 大家势必或多或少听说过。但是什么是RESTful API ?如何理解RESTful API 呢?请大家耐心读完这篇文章,相信您读完后一定会有一个更好的理解。我个人认为,要弄清楚什么是RESTful API,首先要弄清楚什么是REST。REST 全称:REpresentational State Transfer,英文翻译过来就是“表现层状态转化”。如果...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 10万+

ChatGPT搭配Claude 4写文献综述效果出奇的好!四步法直接写出逻辑清晰、层次分明的文献综述(附复制即用专业提示词)

请梳理【研究领域】中核心理论的发展演进过程,包括每一阶段理论的核心观点、提出背景与推动力,并指出理论演化中的关键节点或范式转变。请根据以下文献摘要内容,帮助我梳理该主题的研究趋势,包括:常见研究视角、研究方法的演变、研究对象的变化方向等。请根据以下研究空白与我已有的研究基础,帮我生成一个清晰的研究定位,包括:研究主题、研究对象、方法路径和理论框架。先要明确这个研究领域中一个主导或热门的理论,比如社会支持理论、认知负荷理论等,强调这个理论内部的不一致性、适用性争议,通过交代这⼀争议的背景,引发读者兴趣。

智能AI让学术科研更容易 568

ABAP CDS 和 HANA SQL 的关系

摘要: ABAP CDS与HANA SQL既有紧密联系又有本质区别。ABAP CDS作为语义数据建模框架,在SQL基础上扩展了业务语义层,通过注解(annotations)、关联关系(associations)等机制为数据附加业务含义,并支持权限控制、客户端处理等ABAP平台特性。虽然CDS实体最终会转换为HANA数据库对象执行,但它并非简单的SQL封装,而是构建了独立于数据库的语义模型。二者在数据库执行层深度融合,ABAP CDS通过代码下推技术将计算任务优化到HANA层完成。实际开发中应优先使用ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 858

Restful API

REST API 定义如下:一种应用程序编程接口(API 或 Web API),遵循一组关于应用程序如何使用 HTTP 方法相互通信的架构规则。RESTful Web 服务使用 REST API 协议,因此有时也称为 RESTful API。REST 通常用于构建 Web API,允许客户端与服务器之间通过 HTTP 协议进行交互。REST 是由 Roy Fielding 在 2000 年提出的一种架构风格。

weixin_46598480的博客 1万+

fastlio2原理详解

其核心是利用IMU的高频数据(通常100-500Hz)进行状态预测(前向传播),同时利用激光雷达扫描(通常10-100Hz)作为观测来校正状态。转换了卡尔曼增益的计算公式,将对大维度观测矩阵的求逆(点云数量级)转换为对小维度状态矩阵的求逆,从而极大提升了计算效率。:利用预测出的连续IMU状态,将一帧内每个激光点根据其时间戳反向插值,统一校正到扫描结束时刻,输出无畸变的点云。收敛后,用最终的状态将本帧点云。,根据其精确的时间戳,利用前后两个IMU位姿进行插值,计算出该点采集时刻的精确位姿,再将其全部。

Studying…… 102

api服务器开发语言,web API接口和restful的介绍和使用

web API接口和restful的介绍和使用发布时间:2020-06-23 10:34:57来源:亿速云阅读:269作者:Leah今天就跟大家聊聊有关web API接口和restful的介绍和使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是web API接口?明确了请求方式,提供对应后台所需参数,请求url链接可以得到后台的响应数...

weixin_42154650的博客 1248

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RESTful API的介绍以及如何使用它构建 web 应用程序

RESTful API的资源是通过URI(Uniform Resource Identifier)来标识的,可以使用HTTP方法(GET、POST、PUT、DELETE等)来对资源进行操作,从而实现对应用程序的访问和管理。5. 安全性和认证:RESTful API可以使用基于令牌的认证机制或基于OAuth的认证机制来保护访问资源的安全性。6. 文档:提供RESTful API的文档,描述API的资源、方法和参数等信息,便于开发人员使用和理解API。

chchenxi2011的博客 122

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RESTful API介绍,如何使用它构建 web 应用程序。

其核心思想是将资源(Resource)作为核心概念,通过HTTP方法对资源进行操作,同时采用统一的URI地址、状态码和表示层(Representation)等设计原则,使得API具有灵活性、可扩展性和易用性。最后需要强调的是,RESTful API设计需要充分考虑资源的合理性、URI地址的可读性和HTTP方法的语义性,遵循最佳实践和行业标准,才能为web应用程序提供良好的API服务。1. 设计API的资源和URI地址:根据应用程序的需求,定义资源的种类和URI地址,例如/users、/products等。

活到老学到老 446

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关于 Java API for RESTful Web Services (JAX-RS) 介绍

关于 Java API for RESTful Web Services (JAX-RS) 介绍 一.webService介绍 之前的文章我介绍了cxf webService的使用,它是一种以wsdl发布的形式。下面结合我在了解说明下两组概念: jax-ws 全称:JavaTM API forXML-Based Web Services ,实现基于soap协议的Web Serv...

weixin_34128534的博客 296

关于 Java API for RESTful Web Services (JAX-RS) 介绍及案例

一.webService介绍 之前的文章我介绍了cxf webService的使用,它是一种以wsdl发布的形式。下面结合我在了解说明下两组概念: jax-ws 全称:JavaTM API forXML-Based Web Services ,实现基于soap协议的Web Service提供的API,SOAP:简单对象访问协议,它是交换数据的一种协议规范,是一种轻量的、简单的、基于X...

weixin_30877227的博客 305

JavaWeb基础 -- RESTful API

URI指向资源:URI即统一资源标志符,用于标识抽象或物理资源的一个紧凑字符串,其中包括URL和URN。在这里更多时候可能代指URL(统一资源定位符)。RESTful是面向资源的,每种资源可能由一个或多个URI对应,但一个URI只指向一种资源。无状态:服务器无法保存当前客户端信息,每一次从客户端发送请求,包含的状态信息以及回话等均由客户端保存。服务器根据这些状态信息处理请求。当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中。

qq_64037280的博客 1174

如何使用 Rust 框架进行 RESTful API 的开发?

Actix WebActix-web 是 Rust 中一个非常流行的 Web 框架,以其高性能和异步处理能力而闻名。它基于 Actix 框架,提供了异步非阻塞的事件驱动模型,这使得 Actix-web 能够充分利用多核处理器,实现高吞吐量和低延迟。异步处理:Actix-web 使用 Rust 的异步编程特性,可以处理大量并发请求而不会造成线程阻塞,这对于 I/O 密集型应用来说尤其重要。Actor 模型。

软件行业技术文化交流。 2241

Python web实战之Django 的 RESTful API 设计详解

​ API是应用程序编程接口(Application Programming Interface)的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和数据交换,使得开发者能够利用其他应用程序提供的功能和数据,而无需了解其内部实现细节。 在Web开发中,API通常是用于构建和访问Web服务的一种方式。通过API,开发者可以通过HTTP请求发送和接收数据,从而实现不同应用程序之间的数据传输和交互。

Rocky006的博客 2802

Flask框架构建RESTful API

Flask,作为一个轻量级的Python Web框架,因其简洁的API和强大的扩展性,成为了开发RESTful API的理想选择。然后,通过pip安装Flask以及其他可能需要的库,比如Flask-RESTful(一个用于简化RESTful API开发的扩展)和Flask-SQLAlchemy(用于数据库操作)。随着项目的扩展,你可能需要添加更多的资源、处理复杂的业务逻辑、实现身份验证和授权、管理API版本等。但无论需求如何变化,Flask和它的生态系统都将为你提供强大的支持。),并初始化Flask应用。

weixin_73725158的博客 941

使用ASP.NET Web API构建RESTful API

近年来,很明显,HTTP不仅仅是为了提供HTML页面。它也是构建Web API的强大平台,使用少量动词(GET,POST等)加上一些简单的概念,如URI和头文件。ASP.NET Web API是一组简化HTTP编程的组件。因为它构建在ASP.NET MVC运行时之上,Web API自动处理HTTP的低级传输细节。同时,Web API自然地暴露了HTTP编程模型。事实上,Web API的一个目标是不

AI架构师-CJF 4287

学习笔记-Spring Boot 开发 RESTful Web API(一)

题记: 本篇是Spring Boot 开发学习系列中基础知识学习的一部分,为 RESTful Web API 相关基础知识,为实践操作奠定理论基础。 REST不是一个标准,而是一种软件应用架构风格。基于SOAP的Web服务采用RPC架构,如果说RPC是一种面向操作的架构风格,而REST则是一种面向资源的架构风格。 REST是目前业界更为推崇的构建新一代Web服务(或者Web API)的架构风...

天外来客 1万+

Python 实现 Web API 的 RESTful 设计原则

REST(Representational State Transfer)是一种软件架构风格,用于设计网络服务。资源导向:API 应该以资源为中心,每个资源都有唯一的 URI。统一接口:所有操作都通过标准 HTTP 方法(如 GET、POST、PUT、DELETE 等)进行。无状态:服务器不应存储客户端的状态信息,每次请求都应包含足够的信息。可缓存性:响应可以被标记为可缓存或不可缓存。分层系统:客户端和服务器之间可以有中间层,但客户端不需要知道这些中间层的存在。按需代码。

2501_91173199的博客 1616

一文搞懂什么是RESTful API

在具体构建RESTful API的时候,需要对各种请求有更细致的认知,当然,本案例在实现各种请求的时候为了演示的便捷并没有完全遵循RESTful API规范,例如版本号等信息这里就不添加了,案例更侧重于使用SpringBoot实现这个接口。到这里RESTful API的介绍和实战就结束啦,本篇首先从RESTful的一些特点进行介绍,再到SpringBoot实战RESTful API,最后也说了一些RESTful API并不完美的地方,相信睿智的你对RESTful 一定有了很深刻的理解。

weixin_69619960的博客 2008
上一篇: 浅谈Java中的hashcode方法
下一篇: Java常用8大排序算法+二分法查找法
andybbc
博客等级 码龄11年 64粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值