API调用是否执行POST或GET

时间:2014-11-06 06:56:28

标签: python rest http

对于提取数据,建议通常使用GET并提交表单POST。以下函数如何“检出”项目:

@validate_credentials
@csrf_exempt
@acceptable_methods(???)
def cue_checkout(request, cue_id, user=None, checkout=True):

    cue = Cue.objects.filter(pk=cue_id, user=user)
    if not cue.exists():
        return HttpResponseForbidden('Invalid Cue supplied.')

    cue = cue[0]
    CueAssignment.objects.create(cue=cue, user=user, checkout_timestamp=timezone.now())
    return HttpResponse()

我在想,因为我们正在修改数据,它应该是POST,但有人可以解释一下这里的正确方法是什么以及为什么?

2 个答案:

答案 0 :(得分:2)

W3指定了两个用于描述HTTP方法的术语。

第一个是" Safe"这意味着它不会改变服务器上的数据资源。

第二个是"幂等",这意味着只要数据资源的状态没有改变(与幂等请求无关),请求的结果应该是相同的。

因为您在服务器上创建对象,所以您应该使用POST,因为GET被定义为安全且幂等的操作。 POST同时既不安全也不是幂等(因为我们可能因为约束而拒绝创建对象)。此外,您应该强制执行csrf_protection以避免重用会话cookie,从而保持用户的权限可以自由地用于创建对象。

有一个很好的快速表here用作常用方法的快速参考。

答案 1 :(得分:1)

您可以考虑将项目签出为更新某些资源,例如一辆车。因此,在这种情况下,POSTPUT最有意义。

POST用于修改资源或创建资源。当资源的标识符尚未知道时,使用POST创建资源,例如在创建时,服务器将确定资源的id。

<强>修改 POST /my/resource/[existing-id] - 修改已知位置的资源

创建 POST /my/resource - 通过此操作,您可能会返回201,其中包含标识新资源的位置标头

PUT用于创建资源或覆盖它。在这两种情况下,资源ID都是已知且完全合格的。

创建 PUT /my/resource/[id] - 在已知位置创建资源

<强>修改 PUT /my/resource/[existing-id] - 更新已知位置的资源

<强>差异:

PUT是幂等的。多次调用它总会产生相同的结果

POST不是幂等的。多次调用它可能会产生多个新资源。