web-dev-qa-db-fra.com

Comment utiliser le verbe PATCH avec curl

J'essaie de faire un appel PATCH à un serveur. J'utilise la commande suivante: 

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

Est-ce la bonne façon d'envoyer la requête PATCH? Je reçois une erreur en disant qu'il n'y a pas de paramètre de statut. Je suppose que la --data est pour la demande POST seulement et ainsi le serveur ne trouve pas le paramètre status.

Voici la réponse (FYI):

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

Vous pouvez trouver de la documentation sur ce service ici .

48
sheidaei

C'est le format que vous devriez utiliser:

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

Utiliser -X ne semble pas fonctionner pour envoyer une demande PATCH - vous devez utiliser --request PATCH. En outre, cette API semble vouloir que le paramètre status soit utilisé comme paramètre de requête dans l'URL et non dans le corps de PATCH.

À ce stade, le serveur va renvoyer une erreur 401: "Vous devez être connecté pour modifier les paramètres de page." En supposant que vous deviez vous connecter d'abord avec quelque chose comme ceci:

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

J'ai utilisé les informations d'identification de leur documentation dans cet exemple, qui, selon moi, fonctionnerait sur leur serveur de développement, mais renvoie actuellement une erreur "Mot de passe incorrect".

Cependant, si vous avez des informations d'identification valides, vous devriez récupérer un cookie de session que vous pourrez ensuite utiliser pour authentifier votre demande PATCH.

73

J'essayais de PATCH à une ressource tastypie avec une requête similaire curl. Pour moi, le problème était que les données devaient être transmises comme suit:

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

Notez que ce que je passe au drapeau de données est à l'intérieur de ce qui ressemble à un dictionnaire transmis sous forme de chaîne, plutôt que de placer le paramètre directement comme dans la question. Bien sûr, un param fonctionne aussi comme déjà répondu, mais j'espère que cela aidera certaines personnes.

6
Nick Brady

Votre ligne de commande devrait fonctionner. Comme vous pouvez le voir dans le PATCH RFC5789 , la requête HTTP est similaire à ce que curl envoie (utilisez --trace-ascii pour voir la communication complète de la boucle). Vous voudrez peut-être changer le type de contenu (en utilisant --header ).

Le paramètre d'état manquant mentionné fait probablement référence au contenu du corps de la demande. Vos données "status = closed" ne sont peut-être pas au bon format (JSON?) Ou sont incomplètes.

(Vous semblez avoir eu l'intention d'inclure un lien vers l'API, mais il n'y en a pas!)

2
Daniel Stenberg

Ceci est quelque chose qui a fonctionné pour moi dans mon exemple d'application.

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
Krishnadas PC