Questions tagged «rest»

代表性状态传输(REST)是一种体系结构样式,用于网络软件通过Web传输信息。

3
在松散耦合的微服务架构中,如何跟踪依赖关系?
现代程序中流行的高级体系结构选择是基于REST的微服务系统。这具有几个优点,例如松耦合,易于重用,对可用技术的限制有限,高可伸缩性等。 但是我预见到的这种架构中的问题之一是对应用程序依赖项的可见性不佳。例如,假设我有一个应用程序,该应用程序每天使用一组REST调用。该应用程序还使用第二组REST调用,但每季度仅使用一次。如果我要扫描过去一周的日志,我会看到所有的每日校准数据,但可能看不到季度调用。当需要重构时,每季度调用的中断风险很高。 可以使用什么模式或工具来减少这种风险,并提供对松散耦合体系结构的依赖性的更大可见性?

2
增加一组有限的选项;API重大变化?
以一个HTTP API端点为例,它发出以下响应模型: { "type": "Dog", "name": "Jessi", ... } 该type领域已经在文档中被描述为一个Dog,Cat或Fish。 例如Rat,是否将添加新选项视为API的重大更改? 将选项添加到有限列表(开发人员可以打开该列表)是否被视为对API的扩展或修改?
9 rest  api  api-design  json 

2
用于基于REST的应用程序的JWT身份验证的企业模式?
JWT规范仅描述了有效负载及其发送方式,但未启用身份验证协议,从而允许了灵活性,但非常不幸的是,灵活性可能导致反模式和设计错误。 我正在寻找一些经过深思熟虑且经过测试的JWT身份验证企业模式,可以使用或改编它,但未能找到完整的东西。 我在想的是: 当未满足任何授权标头或JWT令牌无效或已过期时,发送HTTP 401 为了进行身份验证,请使用/ login REST通道,将用户名和密码作为JSON对象发送 为了使令牌保持活动状态,请使用/ keepalive REST通道,每N(5)分钟调用一次,接收新的JWT令牌,并在每次调用后替换现有的令牌(令牌在M(15)分钟后过期) 但是,令我困扰的是该/ keepalive频道的必要性。另一方面,它迫使我防止身份验证过期,即使用户不在(该决定,如果我们希望仍然不执行keepalive的决定),当然,这是对协议的额外调用和额外复杂性。有趣的是,服务器会自动延长令牌。在基于会话的环境中,它是通过重置时间戳来实现的,但是,在这里,服务器将不得不发送新令牌,可能不是每次都发送一次,但是一旦令牌在R(例如10)分钟内到期,就必须发送新令牌。但是将其放在响应主体中将意味着修改JSON响应协议(因此,该解决方案具有侵入性且不透明),并且将客户端可以处理的额外HTTP标头不一定不一定是一个好模式。一世' 有没有可以解决我的问题的现成企业模式?我的协议草案是否可靠?与从头开始设计相比,我更喜欢使用现成的东西。

3
用REST的话来说,资源和表示之间有什么区别?
我对REST的理解使得可以将服务操作建模为状态的表示,并使用HTTP从一种状态转换为另一种状态。直到最近,当我阅读Jimmy Bogard的这篇文章时,我一直将资源理解为服务端状态的代表,我知道他是一个受到社区尊重的聪明的开发人员/架构师。引用该帖子的特定声明 表示形式有所不同–它描述了资源的当前状态(在请求时)。 这让我感到困惑。关于该主题的普遍看法是什么?
9 rest  api  api-design 

2
REST API中的警告不是严重错误
我有一个REST API,对于某些企业(例如DELETE,POST或PUT),我有一些验证规则可以返回错误。 现在,我需要一种新的错误类型,例如非严重错误,它应该以正常方式失败,但是如果发送了“禁止警告”标志,则应该执行该操作。可以问这样的用户:“您确定要更改此状态,您尚未完成” 问题:是否存在针对此类错误的最佳实践? 次要问题: 我可以使用这种行为的任何HTTP语义吗? 我仍然遵循REST的想法吗(对我来说,我看起来确实如此)-我保持它为无状态
9 rest  api 

3
REST是否仅限于乐观并发控制?
语境 由于REST体系结构样式的无状态性(涉及每个请求完全独立),导致服务器从不存储有关客户端的任何信息。 因此,悲观并发控制不合适,因为这将要求服务器存储哪个客户端获得资源锁定。然后在Etag标头的帮助下使用乐观并发控制。(顺便说一句,正如我在那儿问的/programming/30080634/concurrency-in-a-rest-api) 问题 乐观并发控制机制的主要问题在于,您始终允许所有客户端执行任何操作。 我想避免这种情况,而不会破坏REST的无状态原则。我的意思是,所有客户端都无法随时执行任何操作。 题 在我看来,采用半乐观并发控制机制是可能的,例如: 客户可以请求令牌 只能生成一个令牌,并且有效期有限 要对资源(例如POST或PUT)执行操作,客户端必须将此令牌作为请求正文(或标头?)的一部分提供。没有令牌的客户端无法执行这些操作。 它与开放式并发控制非常相似,不同之处在于,只有一个客户端可以执行某些操作(获得令牌的操作)……与“所有客户端可以执行所有操作”相反。 这种机制是否与REST架构风格兼容?它打破了它的任何约束吗?我当时想问一下SO,但这似乎是一个与软件设计有关的高级问题。

3
正在使用具有可接受的副作用(REST)的PUT
每当用户更新表单时,我都想创建一个撤消历史记录。因为这是更新,所以我想使用PUT请求。但是,我读到PUT不需要有副作用。 在这里使用PUT是否可以接受?有更好的选择吗? PUT /person/F02E395A235 { time: 1234567, fields: { name: 'John', age: '41' } } 在服务器中 doPut('person/:personId', // create a new person snapshot ) 编辑: 用户可以看到该历史记录,多次调用将产生多个版本。 解决方案是在创建版本之前检查该版本是否唯一。

4
为什么REST Api不遵循Facade设计模式
在将REST [api]结构与OO模型进行比较时,我看到了这些相似之处: 都: 面向数据 REST =资源 OO =对象 围绕数据的环绕操作 REST =在资源周围环绕VERBS(获取,发布,...) OO =通过封装促进对象周围的操作 但是,例如,在尝试应用外观模式时,良好的OO实践并不总是站在REST api上:在REST中,您没有1个控制器来处理所有请求,并且您没有隐藏内部对象的复杂性。 相反,REST促进资源与资源之间的所有关系的发布以及至少以两种形式的其他关系: 通过资源层次关系(ID为43的联系人由地址453组成): /api/contacts/43/addresses/453 通过REST json响应中的链接: >> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] } 回到OO,外观设计模式考虑了objectA及其“ objectB客户 ” Low Coupling之间的a,以及此objectA及其内部对象组成(objectC,objectD)。随着对象A接口,这允许开发者在极限冲击对象B的对象A的内部变化(objectC和objectD),只要对象A …
9 http  rest  definition 

2
REST还是多层异构系统中的消息队列?
我正在为三层系统设计REST API,例如:Client application-> Front-end API cloud server-> user's home API server (Home)。 Home是家用设备,应该Front-end通过Websocket或长时间轮询来保持连接(这是我们违反REST的第一个地方,以后还会更糟)。Front-end大多数情况下会将Client请求传送到Home连接并处理一些呼叫本身。有时会Home向发送通知Client。 Front-end并Home具有基本相同的API;Client可能是Home通过LAN直接连接。在这种情况下,Home需要Client在Front-end自身上注册一些操作。 该系统中REST的优点是: REST是人类可读的; REST具有明确定义的动词(如CRUD),名词和响应代码到协议对象的映射。 它可以通过HTTP运行并传递所有可能的代理。 REST的反对意见是: 我们不仅需要一种请求-响应通信方式,还需要一种发布-订阅方式。 HTTP错误代码可能不足以处理三层通信错误。Front-end可能返回202 Accepted异步调用只是为了发现必要的Home连接断开了,应该已经连接了503; Home需要向发送邮件Client。Client将必须进行轮询Front-end或维护连接。 我们正在考虑通过Websocket上的WAMP / 高速公路来获得发布/订阅功能,这让我惊讶的是它已经看起来像消息队列。 是否值得评估一种消息队列作为传输方式? 看起来像消息队列相反是: 我需要在消息级别上自己定义CRUD动词和错误代码。 我读到一些有关“较高的维护成本”的信息,但这意味着什么? 这些考虑有多严重?

3
在REST中创建实体关系:我可以通过发布到子ID来创建父关系吗?
我们目前正在设计一种REST API,以访问经典客户数据。API中的元素之一是用户的资产。资产在给定服务下添加。后端API仅会在给定服务下向用户添加资产。因此,没有用户-资产关系,而是用户-[服务]-资产关系。 我们的URI如下所示: /users/{id}/assets/{id}/services/{id} 使用API​​会知道资产ID和服务ID,以创建新条目。我们正在努力的是建立这种关系。 一种简单的方法是将整个关系发布到 /users/{id}/assets/ POST /users/{id}/assets {asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"} 但是我们实际上并不是在创建URI可能表明的资产,而是资产-服务关系。 作为替代方案,我们正在考虑将POST'ing到解决该关系的URI,如下所示: POST /users/{id}/assets/{id}/service/{id} {attribute1:"{var}", attribute2:"{var}"} 但是在这种情况下,资源路径/users/{id}/assets/{id}在POST之前将不存在,并且将被创建为副作用。 是否将POST发送到尚不存在的资源路径? 谢谢你的想法 杰拉德。

3
通常应该为REST服务开发一个客户端库来帮助防止API损坏吗?
我们有一个项目,将由同一团队开发UI代码,但使用与服务层(REST / Java)不同的语言(Python / Django)。每个层的代码存在于不同的代码存储库中,并且可以遵循不同的发布周期。我正在尝试提出一个过程,该过程将从UI层的角度防止/减少服务层中的更改。 我曾经考虑过在UI层级别编写集成测试,每当我们构建UI或服务层时(我们使用Jenkins作为我们的CI工具来构建两个Git仓库中的代码)时,我们都会运行集成测试。发生故障,则服务层中的某些内容中断,并且提交不被接受。 让服务层的开发人员为UI层中存在的REST服务创建并维护一个客户端库是否也是一个好主意(这是最佳实践吗?),只要REST中有重大更改,它们就会更新。他们的服务API?可以想象,我们将拥有UI代码所针对的静态类型的API的优势。如果客户端库API发生更改,则UI代码将无法编译(因此我们将尽快知道有重大更改)。我还将在构建UI或服务层时运行集成测试,以进一步验证UI和服务之间的集成是否仍然有效。
9 rest  django 

3
我应该在JAX-RS @PathParam中使用Date类型吗?
这就是我正在考虑使用Jersey在JEE Glassfish服务器上执行的操作。 @GET @Path("/{name}/{date}") public String getMessages(@PathParam("name") String name, @PathParam("date") Date date) 我喜欢能够告诉使用RESTful Web服务的人们“这里的日期是Java中与Date类一起使用的任何东西”的想法。从他们可以仅查看Date规范的角度来看,这非常简单,并且他们已经有了可以测试的工作模型。 我担心的问题是,当执行此操作时,当Date()不喜欢其在构造函​​数中获得的内容时,JAX-RS并不是很好。由于Date()如果无法解析给出的内容,则会引发错误(例如,如果您将字符串“ today”(而不是实际日期)传递给它),那么JEE服务器将返回404错误。 这是一个好习惯吗?有我没有想到的更好的方法吗?

2
RESTful参考表示-语义链接与URI
我们正在设计一个RESTful API,以打开客户的帐户信息。我们的表示形式包含对与当前资源相关的其他资源的引用。这来自我们在公共API和已发布的资料中可以找到的许多最佳实践。表示形式可以是XML或JSON。 例如,对于帐户资源,我们将引用该帐户的地址,对于分页列表资源,我们将引用第一,下一页和上一页。 该API首先使用<link title="" rel="" href="" />O'Reilly书中所述的语义链接进行设计,并由Netflix和Google在API中使用。当我们的质量检查工程师编写自动化套件时,他们在反序列化链接时遇到了问题。现在,我们建议使用更简单的uri字符串元素,这些元素已在Facebook和Twitter中用于API。 此后,我们的质量检查工程师已经解决了其反序列化问题,但是我仍然担心当前API规范与语义链接的易用性。我们的API主要将由我们的客户和一些第三方合作伙伴使用,而我们之所以选择REST,是因为以前的XML-RPC API对我们的消费者来说太难了。 tl; dr; 题: 实施了语义链接表示的任何人都遇到过困难的消费者问题吗? 更新(6/21):我已经决定保留语义链接,并希望混淆是一个边缘案例。一旦一些消费者使用了该API,我将尽量记住用我们的经验来回答这个问题。 编辑:添加示例 语义帐户JSON: { "username": "paul", "links": [ { "title": "addresses", "rel": "related", "href": "http://example.com/account/paul/addresses" }, { "title": "history", "rel": "related", "href": "http://example.com/account/paul/history" } ] } 语义帐户XML: <account> <username>paul</username> <link title="addresses" rel="related" href="http://example.com/account/paul/addresses" /> <link title="history" …
9 rest  semantics 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.