Comment utiliser le verbe PATCH avec curl

J’essaie de faire un appel PATCH vers 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 indiquant qu’il n’y a pas de paramètre d’état défini. Je suppose que –data ne concerne que les requêtes POST et que le serveur ne trouve donc pas le paramètre status.

C’est 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 .

C’est le format que vous devez utiliser:

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

Utiliser -X ne semble pas fonctionner en termes d’envoi d’une requête PATCH – vous devez utiliser --request PATCH . En outre, cette API semble vouloir le paramètre status tant que paramètre de requête sur l’URL, et non pas dans le corps PATCH.

À ce stade, le serveur va retourner une erreur 401: “Vous devez être connecté pour modifier les parameters de la page.” En supposant que vous devez d’abord vous connecter avec quelque chose comme ceci:

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

J’ai utilisé les informations d’identification de leur documentation dans cet exemple, que je pensais que cela fonctionnerait sur leur serveur de développement, mais que cela renvoyait actuellement une erreur “Mot de passe incorrect”.

Si vous disposez d’informations d’identification valides, vous devez récupérer un cookie de session que vous pouvez ensuite utiliser pour authentifier votre demande PATCH.

J’essayais de PATCH à une ressource de goûter avec une requête curl similaire. 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 transmets à l’indicateur de données est à l’intérieur de ce qui ressemble à un dictionnaire transmis en tant que chaîne, plutôt que de placer le paramètre directement comme dans la question. Bien sûr, un paramètre fonctionne aussi comme déjà répondu, mais j’espère que cela aidera certaines personnes.

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 en boucle complète). Vous voudrez peut-être modifier le type de contenu (à l’aide de –header ).

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

(Vous semblez avoir l’intention d’inclure un lien vers l’API mais il n’y a pas de lien là-bas!)

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

Une autre manière est la suivante, c’est à travers un appel POST si

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

Je suppose que ce n’est pas une manière générale et ne s’applique qu’à cette instance spécifique.