Cómo usar el verbo PATCH con curl


Estoy tratando de hacer una llamada de PARCHE a un servidor. Estoy usando el siguiente comando:

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

¿Es esta la forma correcta de enviar la solicitud de PARCHE? Estoy recibiendo un error que dice que no hay un conjunto de parámetros de estado. Supongo que los data data son solo para POST request y por lo tanto el servidor no encuentra el parámetro de estado.

Esta es la respuesta (FYI):

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

Puede encontrar documentación sobre este servicio aquí.

 41
Author: sheidaei, 2013-04-30

5 answers

Este es el formato que debes usar:

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

Usar -X no parece funcionar en términos de enviar una solicitud de PARCHE, debe usar --request PATCH. Además, esa API parece querer el parámetro status como un parámetro de consulta en la url, no como parte del cuerpo del PARCHE.

En este punto, el servidor va a devolver un error 401: "Debe haber iniciado sesión para modificar la configuración de la página."Supuestamente tienes que iniciar sesión primero con algo como esto:

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

He utilizado las credenciales de su documentación en ese ejemplo, que pensé que funcionaría en su servidor de desarrollo, pero actualmente está devolviendo un error de "contraseña incorrecta".

Sin embargo, si tiene credenciales válidas, debe recuperar una cookie de sesión que luego puede usar para autenticar su solicitud de PARCHE.

 61
Author: James Holderness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 16:40:22

Estaba tratando de parchear a un recurso tastypie con una solicitud curl similar. Para mí, el problema era que los datos tenían que pasarse de la siguiente manera:

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

Observe cómo lo que paso a la bandera de datos está dentro de lo que parece un diccionario pasado como una cadena, en lugar de poner el parámetro directamente como en la pregunta. Por supuesto, un param funciona también como ya se ha respondido, pero espero que esto ayude a algunas personas.

 4
Author: Nick Brady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-09 00:30:17

Su línea de comandos debería funcionar. Como puede ver en el PARCHE RFC5789 , la solicitud HTTP es similar a la que curl envía (use trace trace-ascii para ver la comunicación completa de curl). Es posible que desee cambiar el Content-Type (usando header header).

El parámetro de estado faltante mencionado probablemente se refiera al contenido del cuerpo de la solicitud. Sus datos" status=closed " posiblemente no estén en el formato correcto (¿JSON?) o está incompleta.

(parece Que tienes destinado a incluir un enlace a la API, pero no hay ningún enlace allí!)

 2
Author: Daniel Stenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-03 08:15:02

Esto es algo que funcionó para mí en mi aplicación de muestra.

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 } ] } } }

 0
Author: Krishnadas PC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-13 07:50:16

Una forma alternativa es la siguiente, esto es a través de una llamada POST aunque

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

Supongo que esta no es una forma general y solo se aplica a esta instancia específica.

 -1
Author: sheidaei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-30 18:42:05