如何使用curl命令的PATCH动词

88

我正在尝试向服务器发起PATCH调用。我正在使用以下命令:

curl --data status=closed -X PATCH https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515 

这是正确发送PATCH请求的方式吗?我收到一个错误,说没有设置状态参数。我猜测--data仅适用于POST请求,因此服务器找不到状态参数。

这是响应(供参考):

{"http_status":400,"error":"Parameter validation errors","validation_errors":{"status":{"error":"Request missing status parameter."}}}

你可以在这里找到有关该服务的文档。

6个回答

125

这是您应该使用的格式:

curl --request PATCH https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515?status=closed

那个API似乎需要将status参数作为url的查询参数而不是PATCH请求体的一部分。

此时,服务器将返回401错误:"您必须登录才能修改页面设置。" 假设您需要先使用以下内容登录:

curl --request POST "https://api.viafoura.com/v2/dev.viafoura.com/users/login?password=TeNn!sNum8er1&email=novak@example.com"

我在那个例子中使用了他们文档中的凭据,我想这应该可以在他们的开发服务器上工作,但现在它返回一个“密码错误”的错误。

但是,如果您拥有有效的凭据,您应该会收到一个会话cookie,然后可以使用它来验证您的PATCH请求。


7
奇怪的是,-X--request被记录为相同的标志。 - Beni Cherniavsky-Paskin
5
-X选项按照文档所述的方式工作:curl -u test:testtest -k -X PATCH https://api.test。这里没有问题。 - Artur INTECH
(我更正了答案并删除了先前关于-X无效的错误评论) - Daniel Stenberg
有时候如果 --data 中的 body 是 json 格式,就需要传递 json header:--data '{"name": "new name"}' -H "content-type: application/json" - Vladimir Vukanac

23

我试图使用类似curl请求的方法向tastypie资源进行部分更新(PATCH)。对我来说,问题在于数据必须像这样传递:

curl --data '{"field": "new_value"}' -X PATCH http://127.0.0.1:8000/api/v1/resource_uri/pk/

注意我传递给数据标志的内容,它看起来像是以字符串形式传递的字典中的内容,而不是直接将参数放在问题中。当然,像已经回答过的那样使用参数也可以,但希望这能帮助一些人。


6
如果在--data中传输的内容为json格式,有时需要在请求头中添加json头部信息:--data '{"name": "new name"}' -H "content-type: application/json" - Vladimir Vukanac

5
对于在Windows上运行的用户,如果有复杂的patch表达式需要同时修改多个属性,以下方法对我有效:
curl -X PATCH "http://localhost:5001/tenants/test02" -H "Content-Type: application/json" -d [{"""op""":"""replace""","""value""":"""100""","""path""":"""/employmentEndSettings/daysLoginActive"""},{"""op""":"""replace""","""value""":"""retiree""","""path""":"""/employmentEndSettings/userRoleAfter"""}]

2
您的命令行应该可以工作。如您在RFC5789中所见,HTTP请求与curl发送的类似(使用--trace-ascii来查看完整的curl通信)。您可能需要更改Content-Type(使用--header)。
提到的缺失状态参数可能是指请求正文中的内容。您的“status=closed”数据可能不是正确的格式(JSON?)或者不完整。

2

这是我在我的示例应用程序中使用的方法。

curl --data 'id=57&equipment_type_name=57 edited' -X PATCH http://localhost:5009/equipment-type/update

{
  "info": "Equipment type updation.",
  "response": {
    "status": "success",
    "message": "updateEquipmentType",
    "result": {
      "data": [
        [
          {
            "update_status": 1
          }
        ],
        {
          "fieldCount": 0,
          "affectedRows": 0,
          "insertId": 0,
          "serverStatus": 2,
          "warningCount": 0,
          "message": "",
          "protocol41": true,
          "changedRows": 0
        }
      ]
    }
  }
}

-3

另一种方法如下,不过这是通过POST调用实现的

curl --data status=closed https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515?verb=PATCH 

我猜这不是一般的方法,只适用于这个特定的实例。


2
这违反了REST的原则。您正在失去http PATCH的好处(减少内存、请求带宽等)。 - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接