REST中GET和DELETE方法的响应应该是什么?

问题描述:

在REST中,假设客户端调用了findAll方法(GET) - 它将简单地返回具有HTTP状态代码200的客户端的实体列表(DTO)给客户端。现在让我们假设客户端调用了一个DELETE方法removeObject(Object object )。参数中的对象不存在于数据库中,通常它会返回HTTP状态代码400.我希望客户端以更易于管理的方式知道400的真正原因(更少恐慌)。现在需要一个状态代码/描述,这在GET方法中是不必要的。REST中GET和DELETE方法的响应应该是什么?

我希望客户端为所有消息获得一致的RESPONSE。是否有基于REST的API返回什么指南/最佳实践?

我希望删除的对象时的REST API与一个200响应。其他任何事通常意味着我的要求出了问题。

如果我在删除对象后请求了一个对象,那么我会期待API返回404或者其他性质。

请参见RFC 2616

https://tools.ietf.org/html/rfc2616#section-9.7

+0

但是一个典型的客户端会想知道服务器端发生了什么。 –

+0

我不知道我明白。客户知道他想删除一个对象。所以他首先得到它。然后他要求删除它。如果他想检查它被删除,他可以尝试再次得到它? –

+0

如果我理解正确,那么暗示的是,如果客户端在DELETE中收到404错误,它应该表明请求的对象不处于要删除的状态,并且客户端不需要重试请求。那么简单地返回404就足够了吗? –

400的状态码很好,但是你也返回一些前端可以解析和理解的对象(即json)。这样,您的前端可以获取有关该错误的更多信息,并可以在将其呈现给用户之前将其覆盖。一些非常基本的,勉强功能伪代码:

后端:

return(status_code=400, 
     body={message: {type: "error", description: "some text here"}) 

前端:

if (status_code >= 400): 
    console.log(json.loads(response).message.description) 
+0

状态代码400意味着请求格式不正确,我会尽量避免这个,因为它可能会导致混淆 –

+0

@DaiBok https://*.com/a/6123801/1121879 https://*.com/questions/ 5604816/whats-the-most-appropriate-http-status-code-for-an-item-not-found-error-page 400,412或404是如果他收到一个不在数据库(这是OP正在讨论的内容)。如果找不到要删除的对象,则不能接受200。 –

+0

请参阅第9.7节https://tools.ietf.org/html/rfc2616#section-9.7 –

你是什么意思REST第9.7?假设,我们参考Roy FieldingHttp 1.1标准。

根据标准,DELETE是幂等方法。即如果你多次请求DELETE,副作用将是相同的。即数据库中的所有相同记录将被标记为“已删除”或不存在。

首先,要请求DELETE,请求资源。说,http://some.url/to/resource。如果它永远不会是现在 - 你应该有404

科回应“9.7 DELETE”的标准说:

一个成功的响应应该是200(OK)如果响应包含描述的 实体状态,202(接受)如果行动还没有制定 ,或204(无内容)如果行动已颁布 但答复不包括实体。

如果您没有从数据库中完全删除记录,并且希望在随后的请求中通信该资源已被删除且不再可用,那么标准部分“10.4。11 410飘”,他说:

的410响应的主要目的是通过通知收件人,资源是 故意不可用服务器业主的愿望是 远程链接到协助网页 维护任务资源被删除。

但是使用这个响应代码或提供了一段时间是没有必要的,而且反应可能也404所以使用它,如果你想与众不同,资源是否已被删除或从未出现过。

+0

忘记findAll():p用一些返回DTO列表的方法替换它 –

+1

@ tahniat-ashraf我编辑了我的答案。根据标准,现在更加正确,还有更多的链接。 – iTollu