Questions tagged «rest»

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

6
许多小请求与几个大请求(API设计)
我目前正在与一个组织一起从事以下项目: 客户端 -通过REST API从主服务器获取数据。 服务器 -通过第三方API向其他各种服务器请求数据 第三方API-无法控制的向服务器提供数据的服务(Reddit,Hackernews,Quora等) 出于争论的目的,假设客户端首先需要每个第三方API的项目列表。从该列表中,将选择一个项目,此时客户需要查看该项目的全部内容以及对该项目的响应(即评论)。我试图在三个选项之间做出选择: 点菜 用这种方法,我的服务器上将有3个单独的端点:一个用于获取项目列表,一个用于获取项目的主要内容,以及一个用于获取项目的响应。 优点:我从来没有发出比我需要更多的请求,请求应该很小,因此通常它们应该更快。 缺点:我必须提出很多要求。从列表中选择一个项目后,用户可能必须先等待才能看到主要内容,然后再等待更长的时间才能看到响应 服务器端缓存 在此请求中,我将对服务器进行一次调用以“获取”所有源的所有数据。然后,数据将被缓存在服务器上。然后,客户端将具有与以前相同的REST终结点,但是在两次调用之间不会有太多等待,因为我的服务器已经拥有了数据,只需要将其提供给客户端即可。 优点:仍然易于在客户端实现,但没有延迟问题 缺点:更多涉及服务器端,第一次调用可能要花很长时间。 客户端缓存 除了客户端只向服务器发出一个请求外,此方案与上一个相似:将所有数据提供给我。从这里开始,客户有责任保存数据并正确使用它们。 优点:易于服务器实施,在首次通话后非常快速 缺点:第一次调用将非常缓慢,客户端实现更为复杂 我不确定哪种方法是最好的,或者不确定是否缺少明显的解决方案。任何建议将不胜感激!

3
为什么PATCH方法不是幂等的?
我对此很纳闷。 假设我有一个user资源id和name字段。如果我想更新一个字段,我可以像这样对资源进行PATCH请求 PATCH /users/42 {"name": "john doe"} 然后应用程序将更新用户42的名称。 但是,如果我重复此请求,结果会有所不同吗? 根据RFC 5789 PATCH既不安全也不具有幂等性

4
HTTP状态代码,用于“静态处理”
我正在构建一个RESTful API,该API支持对长时间运行的任务进行排队以进行最终处理。 该API的典型工作流程为: 用户填写表格 客户端将数据发布到API API返回202已接受 客户将用户重定向到该请求的唯一URL(/results/{request_id}) 〜最终〜 客户再次访问URL,并在该页面上看到结果。 我的麻烦在于步骤6。每当用户访问该页面时,我都会向我的API(GET /api/results/{request_id})发出请求。理想情况下,该任务将在此时完成,并且我将与他们的任务结果一起返回200 OK。 但是用户很吃力,我希望在结果尚未完成处理时会进行许多过度的刷新。 我最好的状态代码指示是什么: 该请求存在, 还没有完成 但它也没有失败。 我不希望有一个代码可以传达所有这些信息,但是我希望可以让我传递元数据而不是让客户期望内容。 返回202可能是有意义的,因为在这里没有别的意思:这是一个GET请求,因此可能没有任何东西被“接受”。那是一个合理的选择吗? 所有这些的明显替代方案-起作用,但违反了状态码的一个目的-将始终包括元数据: 200 OK { status: "complete", data: { foo: "123" } } ...要么... 200 OK { status: "pending" } 然后客户端,我会(叹息)switch上response.data.status,以确定该请求是否已完成。 这是我应该做的吗?还是有更好的选择?Web 1.0对我而言是如此。
47 rest  http 

2
REST API应该如何处理对部分可修改资源的PUT请求?
假设REST API响应HTTP GET请求,在子对象中返回一些其他数据owner: { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'Programmer' } } 显然,我们不希望任何人能够PUT支持 { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'CEO' } } 并取得成功。的确,在这种情况下,我们甚至可能不会采取任何措施来实现这一目标。 但是,这个问题不仅仅涉及子对象:通常,应该对不应在PUT请求中进行修改的数据执行哪些操作? 是否应要求PUT请求中缺少它? 是否应该默默丢弃? 是否应该检查它,如果它与该属性的旧值不同,则在响应中返回HTTP错误代码? 还是我们应该使用RFC 6902 JSON补丁而不是发送整个JSON?

3
做复杂的RESTful搜索方法的正确方法是什么?
遵循REST原则,我想为我的API创建一个GET方法,该方法使用一些条件进行搜索并将结果返回给客户端。问题是标准最多可以包含14个参数,其中一个是复杂对象列表,因此... 我什至不知道是否可以将这些复杂的对象与url参数进行编码/解码。 我没有计算网址可以获得多长时间,但是我确定它会足够大,甚至可能达到网址长度限制? 同样,搜索应该以“实时”方式显示结果,我的意思是,每当用户从搜索表单中更改某些内容时,他应该能够看到新结果而无需按下任何“搜索”按钮。 您能否向我澄清这些要点,对于创建具有很多参数的静态搜索方法有何建议?
44 rest  api 

2
建议的“达到请求限制”的HTTP REST状态代码
我正在整理一个REST服务的规范,其中的一部分将包含在整个服务范围内以及一组资源或单个资源上限制用户的功能。同样,这些超时可以按资源/组/服务进行配置。 我只是在浏览HTTP 1.1规范,并试图决定如何与客户端通信,因为请求已达到极限,因此无法满足请求。 最初,我认为客户端代码403 - Forbidden就是这样,但从规范中可以看出: 授权将无济于事,不应重复请求 困扰着我 实际上似乎503 - Service Unavailable是一种更好的用法-因为它允许通过使用Retry-After标头来传递重试时间。 将来我可能会希望通过电子商务支持“购买”更多的请求(在这种情况下,如果客户端代码402 - Payment Required已完成,那就太好了!)-但我认为这也同样可以被压缩为503响应。 您认为我应该使用哪个?还是有我没有考虑过的另一个?

2
性能是不完全使用SignalR(网络套接字)来代替传统REST API的唯一原因吗?
我曾SignalR在多个项目中实现实时消息传递功能。它似乎工作可靠,并且非常易于学习使用。 至少对我来说,诱惑是放弃开发Web API服务,并将其SignalR用于一切。 我觉得这可以通过深思熟虑的设计来实现,如果可以的话,这意味着将需要更少的客户端代码。更重要的是,这将意味着将有一个单一的服务接口,而不是一个分离的接口,并且在最坏的情况下,可以将其连接起来而无需考虑何时渲染事物,等等。 因此,我想知道: 除了性能之外,还有其他原因不使用SignalR代替所有Web服务吗? SignalR的性能是否足以引起人们的注意? 能够将服务器端对象和服务定义转换为客户端服务访问代码而不用愚蠢的东西一直是我的梦想node.js。例如,如果我定义了一个有趣的对象InterestingObject以及该对象的服务,CRUD则InterestingObjectService可以定义到该服务的标准URL路由-例如“ / {serviceName} / {methodName}”,但是我仍然需要编写客户端代码才能访问服务。由于对象将被从客户端传递到服务器和背部,没有实际的原因有在客户端代码中显式定义对象,也无需显式定义执行CRUD操作的路由。我觉得应该有一种标准化所有方法的方法,这样就可以在假定服务访问从客户端到服务器再到服务器的工作透明的前提下编写客户端,就像我在编写WinForms或Java时一样Applet或Native App或您拥有的东西。 如果SignalR足以代替传统的Web服务使用,则它可能是实现此目的的可行方法。SignalR已经包含使集线器像我描述的服务那样工作的功能,因此我可以定义一个通用基础(CRUD)服务,该服务可以开箱即用地提供所有这些功能。然后,我几乎可以认为服务访问是理所当然的,这使我免去了重新编写代码以访问约定可以访问的内容的烦恼-更重要的是,我不得不花时间编写代码来定义如何对其进行更新。 DOM。 阅读我的编辑后,我觉得这可能有点荒谬,所以请随时问我是否对我的想法有疑问。基本上,我希望服务访问尽可能透明。

5
将函数作为参数传递给其他函数,不好的做法?
我们一直在改变AS3应用程序与后端通信的方式,并且正在实现REST系统以替换旧系统。 不幸的是,开始工作的开发人员现在正在休长期病假,并且已移交给我。在过去的一周左右的时间里,我一直在使用它,并且我了解该系统,但是有一件事让我感到担心。函数似乎有很多传递给函数。例如,调用服务器的类具有一个函数,该函数将在过程完成且已处理错误时调用并传递对象。 它给我一种“糟糕的感觉”,让我感觉这是一种可怕的做法,我可以想到一些原因,但是在我建议对系统进行重新设计之前,我需要一些确认。我想知道是否有人对这个可能的问题有任何经验?

4
REST-通过Accept标头与扩展进行内容协商之间的权衡
我正在设计一个RESTful API。我们知道我们想为任何给定资源返回JSON和XML。我一直在想我们会做这样的事情: GET /api/something?param1=value1 Accept: application/xml (or application/json) 但是,有人为此使用扩展名,就像这样: GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1) 这些方法的权衡是什么?未指定扩展名时最好依靠accept标头,但在指定扩展名时依靠荣誉标头吗?这种方法有缺点吗?

6
在RESTful API中将数组作为响应返回的最佳方法是什么?
假设我们有这样的资源, book: type: object properties: author: {type: string} isbn: {type: string} title: {type: string} books: type: array items: book 因此,当某人GET在books资源上做出“ a” 时,我们将返回以下内容 [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"}, {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}] 我从某个工作人员那里听说,建议的REST做法是始终将响应作为JSON对象返回,这意味着我们的架构应books如下所示, books: type: object properties: list: type: …
40 rest  json 

1
REST API响应中的null与缺少键
在我的应用程序中说,有些用户给我们他们的姓氏,有些则没有。在REST API响应中,首选哪个主体: 具有“空”值: {"firstName": "Bob", "lastName": null} 或只是缺少的钥匙: {"firstName": "Bob"}
40 rest  api-design  json 

5
如何描述故意打破REST标准的架构转变?
我正在提议对一个架构很差的软件项目进行更改,该项目会遇到很多问题。在较高的层次上,该项目在前端使用了Angular,并使用了各种REST API。一切都很棒(我看不到需要更改我们的技术或工具)。问题在于,UI中的代码库比服务器端API大得多。大多数业务逻辑都存在于UI中,而REST API是与UI层的简单CRUD数据库接口。 例如,发给客户的POST将创建客户记录,而PUT将修改该客户。不多,也不少。但是,我们的业务逻辑要求更高。创建客户的一般过程所要做的不仅仅是插入1条数据库记录。它将在其他必要的表中提供数据,执行某些验证和计算等。我更愿意进行单个POST / PUT调用来封装所有这些行为,从而减轻使用方客户端的负担。 因此,我的观点是,这种总体编排应该驻留在服务器(我们拥有完全控制权,日志等)上,而不是UI上,但是一个反对意见是该方法将不再是RESTful。因此,当我的建议是继续使用现有的技术堆栈,但在代码所属的位置实现根本的转变时,我不确定如何最好地描述这种方法。

3
REST API-API是否应返回嵌套的JSON对象?
当涉及JSON API时,将响应展平并避免嵌套JSON对象是一种好习惯吗? 例如,假设我们有一个类似于IMDb的API,但用于视频游戏。有几个实体,分别是Game,Platform,ESRBRating和GamePlatformMap,它们映射了Game和Platform。 假设您请求/ game / 1来获取ID为1的游戏,并返回嵌套了平台和esrbRating的游戏对象。 { "id": 1, "title": "Game A", "publisher": "Publisher ABC", "developer": "Developer DEF", "releaseDate": "2015-01-01", "platforms": [ {"id":1,"name":"Xbox"}, {"id":2,"name":"Playstation"} ], "esrbRating": { "id": 1, "code": "E", "name": "Everyone" } } 如果您使用的是JPA / Hibernate之类的工具,并且将其设置为FETCH.EAGER,它可能会自动为您执行此操作。 另一个选择是简单地使用API​​并添加更多端点。 在这种情况下,当请求/ game / 1时,仅返回游戏对象。 { "id": 1, "title": "Game A", …
37 design  rest  api-design  json 

2
做REST的正确方法是什么?
如今,每个人都在进行SOA,即使有些人实际上并不了解全部内容。所以他们做错了。以此为类比,我知道REST是什么(或者至少我认为我是这样做的),并且想要做一些。但是我想做对。 所以我的问题是做REST的正确方法是什么?

5
RESTful API。我应该返回创建/更新的对象吗?
我正在使用WebApi设计RESTful Web服务,并且想知道在更新/创建对象时返回哪些HTTP响应和响应主体。 例如,我可以使用POST方法将一些JSON发送到Web服务,然后创建一个对象。然后,将HTTP状态设置为“创建”(201)或“确定”(200),并简单地返回诸如“添加了新员工”之类的消息,或者返回最初发送的对象,是最佳实践吗? PUT方法也是如此。哪种HTTP状态最适合使用,我是否需要返回创建的对象或仅返回一条消息?考虑到用户知道他们无论如何都试图创建/更新对象的事实。 有什么想法吗? 例: 添加新员工: POST /api/employee HTTP/1.1 Host: localhost:8000 Content-Type: application/json { "Employee": { "Name" : "Joe Bloggs", "Department" : "Finance" } } 更新现有员工: PUT /api/employee HTTP/1.1 Host: localhost:8000 Content-Type: application/json { "Employee": { "Id" : 1 "Name" : "Joe Bloggs", "Department" : "IT" } } 回应: …
36 rest  http 

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.