首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要遵循标准REST最佳实践/指南?

为什么我要遵循标准REST最佳实践/指南?
EN

Software Engineering用户
提问于 2018-11-15 03:06:58
回答 2查看 767关注 0票数 1

我发现标准REST最佳实践非常混乱,因为您需要了解所有HTTP方法,如GET/POST/PUT/DELETE/修补程序等等。不仅如此,在调用API时,您可能需要提供以下内容:

  1. 正文
  2. 参数
  3. 查询串
  4. 标头

在我看来,这不仅使服务器开发人员感到困惑,也使客户机感到困惑。

因此,我想知道,是否有任何具体的理由,有多种方法而不是有一个统一的方式?是为了安全措施吗?

如果你能提供一些来自IETF,RFC,甚至ISO文档的实质性参考,而不是你的个人意见,我会很高兴。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-11-15 03:41:09

因此,我想知道,是否有任何具体的理由,有多种方法而不是有一个统一的方式?是为了安全措施吗?

不,这不是为了保安。

标准方法变化的原因是,我们现在可以使用理解这些语义的泛型组件来为我们做大量的工作。

例如,使用标准REST方法,标准方法意味着可以通过通用组件自动处理缓存失效。这意味着,当响应在不可靠的网络上丢失时,泛型组件可以知道哪些请求要重新发送,哪些不能。

如果你能提供一些来自IETF,RFC,甚至ISO文档的实质性参考,而不是你的个人意见,我会很高兴。

您应该从Fielding的论文开始,特别是第六章,他回顾了“从应用REST中吸取的经验和教训”,以“指导现代网络体系结构的设计和开发”。

Jim的talk 基于域驱动的RESTful系统设计是另一个很好的选择,尤其是演讲早期的基础材料。

票数 2
EN

Software Engineering用户

发布于 2018-11-15 04:22:01

REST和HTTP实现的REST不是一回事。

Restful服务只是在一个请求/响应对中完成交互的服务。

Restful服务器在完成请求/响应后不会维护会话或任何活动状态信息。要创建会话的假象,每个请求都包含所有标识信息、一个操作--通常是基于CRUD的操作(但不一定),以及所有所需的额外数据。如果忽略了请求的任何部分,服务器就不会查询它,也不会维护等待它的会话。它会以错误响应,可能会识别原因,然后关闭连接。否则,服务器将处理请求,返回响应,然后忘记有关请求/响应对的所有细节。下一个请求必须提交完整的详细信息,即使许多请求与前一个请求相同。

从开发和维护的角度来看,这有很多好处。它保持了交互简单,系统模块化,并创建了强大的边界,这使得测试(和单元测试)更容易和更快。状态的简化也使得生产中的水平缩放变得容易得多。

REST by HTTP利用HTTP协议提供面向CRUD的Restful接口。与连接(tcp/ip)、安全性(ssl)、身份验证(oauth)、服务命名(域名、url路径)、解析/生成http请求/响应消息的库等有关的许多问题。有成熟和良好测试的解决方案。

正如您已经注意到的,HTTP几乎是一个restful协议,但并不完全是一个restful协议。而且,由于它的时代,它已经积累了许多功能,不总是坐好,或有替代的解决方案。这确实会导致混乱。这与安全并没有什么特别的关系,但事实上Web是一个开放的平台。许多提供者没有(而且仍然没有)提供对所有标准的充分支持,这导致许多“事实上”/“最低公分母”要素成为规范,并在以后的标准修正中记录下来。

至于良好的实践,借鉴标准的软件界面设计。它只是用HTTP请求/响应来表示。另外,研究提供Restful接口的其他产品,并研究它们是如何设计的。除非您有一个全新的应用程序,否则可能已经有了类似的产品。向他们学习。

在我看来,您少关注使用HTTP的事实,而更多地关注Restful。服务背后的业务逻辑不应该关心请求是否来自HTTP、电子邮件、桌面应用程序或其他I/O设备。

为此目的:

  • 识别系统中的名词以及您可以直接使用它们做什么。
    • 读操作
    • 执行操作
    • 更新操作
    • 删除操作
    • 创建操作。

  • 每个对象都有一个惟一的名称。
    • 该对象上的每个操作都有一个唯一的名称。
    • 操作请求明智地保存了完成操作所需的所有信息。
    • 操作的响应明智地保存了操作可以用完成的所有信息
      • 包括“未授权”或“发生意外事件,请求失败”等错误详细信息。
      • 不要泄露实现细节,例如堆栈跟踪或异常名称,而是将它们发送到服务器的日志。

现在,获取HTTP指南并翻译要通过HTTP发送的Restful服务请求/响应。

  • 获取对该对象的URL ->只读操作
  • 删除针对该对象的URL ->删除操作
  • POST URL/{ id }/up/item/{ name }/check?key=val { " country ":"au“} ->对该id下面的某个名称具有副作用的操作具有某些键值,并且国家在某种程度上对操作很重要。
  • ..。

如果请求需要参数,请查找提供所需结果的标头字段、参数、正文和查询字符串。这里没有正确的答案,它的所有上下文都是基于所期望的。例:

  • 查询参数可以标记为书签,因为它们是URL的一部分。
  • JSON主体为大多数数据结构提供了简单的序列化/反序列化。

如果有些数据位于URL中,有些在查询字符串中,有些在正文中,则完全可以接受http请求。只要它清楚地记录了如何、何时和预期的行为。

重要的是,完成请求所需的所有信息都可以从HTTP请求中提取到一个数据结构中,以传递给您自己的业务逻辑,并且响应也可以类似地编码在HTTP响应中。这样,您的业务逻辑是分开的,并且是可测试的。

现在,记录映射并告诉您服务的客户端。他们将从他们的软件映射到这个界面,然后再回来。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/381520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档