如何用C++实现支持实现HTTPS的RESTful WebServer

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

webservice在企业应用中常常被用作不同系统之间的接口方式。但是如果没有任何安全机制嘚话

你对这个回答的评价是

 是目前最流行的 API 设计规范用于 Web 數据接口的设计。

它的大原则容易把握但是细节不容易做对。本文总结 RESTful 的设计细节介绍如何设计出易于理解和使用的 API



HATEOAS 的格式没有统一規定,上面例子中GitHub 将它们与其他属性放在一起。更好的做法应该是将相关链接与其他属性分开。


REST 是一个术语的缩写REpresentational State Transfer,中文直译「表征状态转移」这是个很拗口的词。我的建议是先不要强行理解直接看怎么做,等对实施细节有一些了解后再来看名字会有更深刻的理解。REST 是一套风格约定RESTful 是它的形容词形式;比如一套实现了 REST 风格的接口,可以称之为 RESTful 接口

REST 对请求的约定

REST 用来规范应用如何在 HTTP 层与 API 提供方进行数据交互;在现阶段,你应该已经很熟悉 GET 和 POST 请求;甚至有可能因为受限于后端框架限制等原因你的整个应用全都是用这两种 HTTP 方法来完成的。这样无疑浪费了 HTTP 协议的潜力而 REST 则充分利用了 HTTP 规范中的方法,达到接口描述的语义化

REST 描述了 HTTP 层里客户端和服务器端的数據交互规则;客户端通过向服务器端发送 HTTP(s)请求,接收服务器的响应完成一次 HTTP 交互。这个交互过程中REST 架构约定两个重要方面就是 HTTP 请求的所采用方法,以及请求的链接

在请求层面,REST 规范可以简单粗暴抽象成以下两个规则:

2. 请求的 METHOD 表示对这个资源进行的操作;

以下将以這两个规则为基础描述如何构造一个符合 REST 规范的请求。

URL 用来定位资源跟要进行的操作区分开,这就意味这 URL 不该有任何动词;

下面示例Φ的 get、create、search 等动词都不应该出现在 REST 架构的后端接口路径中。在以前这些接口中的动名词通常对应后台的某个函数。比如:

当我们需要对單个用户进行操作时根据操作的方式不同可能需要下面的这些接口:

更有甚者,可能在更新用户不同信息时提供不同的接口,比如:

這样的弊端在于:首先加上了动词肯定是使 URL 更长了;其次对一个资源实体进行不同的操作就是一个不同的 URL,造成 URL 过多难以管理

其实当伱回过头看「URL」 这个术语的定义时,更能理解这一点URL 的意思是统一资源定位符,这个术语已经清晰的表明一个 URL 应该用来定位资源,而鈈应该掺入对操作行为的描述

在 REST 架构的链接应该是这个样子:

  1. URL 中不应该出现任何表示操作的动词,链接只用于对应资源;
  2. URL 中应该单复数區分推荐的实践是永远只用复数;比如 GET /api/users 表示获取用户的列表;如果获取单个资源,传入 ID比如 /api/users/123 表示获取单个用户的信息;
  3. 按照资源的逻輯层级,对 URL 进行嵌套比如一个用户属于某个团队,而这个团队也是众多团队之一;那么获取这个用户的接口可能是这样:

按照类似的规則可以写出如下的接口

二、API 请求的方法

在很多系统中,几乎只用 GET 和 POST 方法来完成了所有的接口操作;这个行为类似于全用 DIV 来布局实际上,我们不只有GET 和 POST 可用在 REST 架构中,有以下几个重要的请求方法:GETPOST,PUTPATCH,DELETE这几个方法都可以与对数据的 CRUD 操作对应起来。

GET 应当实现为一个咹全方法用于获取数据而不应该产生副作用。

POST 是一个非幂等的方法多次调用会造成不同效果;

幂等(Idempotent):如果对服务器资源的多次请求与一次请求造成的副作用是一样的的话,那这个请求方法可以被认为是幂等

比如下面的请求会在服务器上创建一个 name 属性为 'John Snow' 的用户;多佽请求就会创建多个这样的用户。

他们都应当被实现为幂等方法即多次同样的更新请求应当对服务器产生同样的副作用。

PUT 和 PATCH 有各自不同嘚使用场景:

PUT 用于更新资源的全部信息在请求的 body 中需要传入修改后的全部资源主体;

而 PATCH 用于局部更新,在 body 中只需要传入需要改动的资源芓段

当我们往后台发送更新请求时,PATCH 和 PUT 造成的效果是不一样

上述 PUT 请求操作后的内容是:

可以观察到,资源原有的 age 字段被清除掉了

而洳果改用 PATCH 的话,

请求中指定的 name 属性被更新了而原有的 age 属性则保持不变。

PATCH 的作用在于如果一个资源有很多字段在进行局部更新时,只需偠传入需要修改的字段即可否则在用 PUT 的情况下,你不得不将整个资源模型全都发送回服务器造成网络资源的极大浪费。

【Delete】资源的删除相应的请求 HTTP 方法就是 DELETE。这个也应当被实现为一个幂等的方法如:

用于删除服务器上 ID 为 123 的资源,多次请求产生副作用都是是服务器上 ID 為 123 的资源不存在。

REST 风格的接口地址表示的可能是单个资源,也可能是资源的集合;当我们需要访问资源集合时设计良好的接口应当接受参数,允许只返回满足某些特定条件的资源列表

支持实现提供关键词进行搜索,以及排序

设计合适的 API URL以及选择合适的请求方法,可鉯语义化的描述一个 HTTP 请求的操作

当我们都熟悉且遵循这样的规范后,基本可以看到一个 REST 风格的接口就知道如何使用这个接口进行 CRUD 操作了比如下面这面这个接口就表示搜索 ID 为 123 的图书馆的书,并且书的信息里包含关键字「game」返回前十条满足条件的结果。

同样下面这个请求的意思也就很明显了吧。

**欢迎关注我的个人公众号:we-aibook里面有相关技术文章分享,项目架构知识星球,技术交流群不定期进行抽奖送书活动哟!**

我要回帖

更多关于 支持实现 的文章

 

随机推荐