Как использовать глагол PATCH с curl
Я пытаюсь сделать вызов PATCH на сервер. Я использую следующую команду:
curl --data status=closed -X PATCH https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515
Это правильный способ отправки запроса PATCH? Я получаю сообщение об ошибке, утверждающее, что не задан параметр состояния. Я предполагаю, что --data только для запроса POST, и, следовательно, сервер не находит параметр состояния.
Это ответ (FYI):
{"http_status":400,"error":"Parameter validation errors","validation_errors":{"status":{"error":"Request missing status parameter."}}}
Вы можете найти документацию об этой услуге здесь.
6 ответов
Это формат, который вы должны использовать:
curl --request PATCH https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515?status=closed
С помощью -X
кажется, не работает с точки зрения отправки запроса PATCH - вы должны использовать --request PATCH
, Кроме того, этот 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.
Я пытался найти патч вкусного пирога с подобным запросом завитка. Для меня проблема заключалась в том, что данные должны были передаваться так:
curl --data '{"field": "new_value"}' -X PATCH http://127.0.0.1:8000/api/v1/resource_uri/pk/
Обратите внимание, что то, что я передаю флагу данных, находится внутри словаря, переданного в виде строки, вместо того, чтобы помещать параметр напрямую, как в вопросе. Конечно, парам работает тоже, как уже ответили, но, надеюсь, это поможет некоторым людям.
Для тех, кто запускает его на 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"""}]
Ваша командная строка должна работать. Как вы можете видеть в PATCH RFC5789, HTTP-запрос аналогичен тому, что посылает curl (используйте --trace-ascii, чтобы увидеть полный обмен данными curl). Возможно, вы захотите изменить Content-Type (используя --header).
Упомянутый отсутствующий параметр состояния, вероятно, относится к содержимому в теле запроса. Возможно, ваши данные "status=closed" не в правильном формате (JSON?) Или они неполные.
(Вы, похоже, намеревались включить ссылку на API, но там нет ссылки!)
Это то, что сработало для меня в моем примере приложения.
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
}
]
}
}
}
Альтернативный способ заключается в следующем, это через вызов POST, хотя
curl --data status=closed https://api.viafoura.com/v2/dev.viafoura.com/pages/7000000043515?verb=PATCH
Я предполагаю, что это не общий способ, а относится только к этому конкретному случаю.