如何在 curl 中使用 PATCH 动词

Posted

技术标签:

【中文标题】如何在 curl 中使用 PATCH 动词【英文标题】:How to use PATCH verb with curl 【发布时间】:2013-04-24 18:29:50 【问题描述】:

我正在尝试对服务器进行 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."

您可以找到有关此服务的文档here。

【问题讨论】:

【参考方案1】:

这是您应该使用的格式:

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 请求。

【讨论】:

奇怪,-X--request 被记录为同一个标志。 -X 的工作方式与文档中的一样:curl -u test:testtest -k -X PATCH https://api.test 没问题。 (我编辑了答案并删除了之前关于 -X not working 的错误评论) 如果 --data 中的 body 是 json 有时需要传递 json 头:--data '"name": "new name"' -H "content-type: application/json" !【参考方案2】:

我试图用类似的 curl 请求修补到一个美味的资源。对我来说,问题是数据必须像这样传递:

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

请注意我传递给数据标志的内容是如何在看起来像作为字符串传递的字典的内部,而不是像问题中那样直接放置参数。当然,参数也可以像已经回答的那样工作,但希望这对某些人有所帮助。

【讨论】:

如果 --data 中的 body 是 json 有时需要传递 json 头:--data '"name": "new name"' -H "content-type: application/json" !【参考方案3】:

您的命令行应该可以工作。正如您在 PATCH RFC5789 中看到的那样,HTTP 请求与 curl 发送的类似(使用 --trace-ascii 查看完整的 curl 通信)。您可能想要更改 Content-Type(使用 --header)。

提到的缺失状态参数可能是指请求正文中的内容。您的“status=closed”数据可能格式不正确(JSON?)或不完整。

【讨论】:

【参考方案4】:

这在我的示例应用中对我有用。

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
        
      ]
    
  

【讨论】:

【参考方案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"""]

【讨论】:

【参考方案6】:

另一种方法如下,但这是通过 POST 调用

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

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

【讨论】:

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

以上是关于如何在 curl 中使用 PATCH 动词的主要内容,如果未能解决你的问题,请参考以下文章

Rest API 设计 PUT vs PATCH

HTTP动词

PATCH 和 PUT 请求的主要区别是啥?

Python 请求 - 动态传递 HTTP 动词

用于状态更改的 REST 动词 - 我们可以就 POST 达成一致吗?

如何在 alamofire 中使用自定义动词?