2016-07-21 4 views
2

J'écris et API dans R en utilisant plumber qui consommera idéalement le JSON qu'il reçoit sur POST. Mais je ne peux pas obtenir le endpoint POST example de travailler de cette façon, donc je manque probablement quelque chose d'évident.Avoir une API R Plumber consomme JSON sur POST

En utilisant l'exemple d'URL et Curl je peux faire ce qui suit sans problème:

curl -i -X POST http://plumber.tres.tl/append/append -d "val=50" 

Mais la façon dont l'exemple est présenté:

POST {val: 50} -> http://plumber.tres.tl/append/append 

suggère que JSON serait également autorisée. J'ai donc essayé:

curl -H "Content-Type: application/json" -X POST -d '{"val":50}' http://plumber.tres.tl/append/append 

Et la variation pour assurer l'encodage UTF-8, commentez la " et toutes sortes d'autres combinaisons basées principalement sur ce que je trouve ici sur Stackoverflow à propos de poste. Par exemple:

curl -i -X POST -H "Content-Type: application/json" http://plumber.tres.tl/append/append -d '{"val":50}' 
curl -i -X POST -H "Accept: application/json" -H "Content-Type: application/json" http://plumber.tres.tl/append/append -d '{\"val\":50}' 
curl -i -X POST -H "Content-Type: application/json;charset=UTF-8" http://plumber.tres.tl/append/append -d '{"val":50}' 

en utilisant également un fichier et d'essayer de le publier comme @my.json n'a pas fonctionné.

Peut-être que c'est quelque chose du côté Plumber: Je m'attendrais à ce que vu le jeu d'outils pour sérialiser la sortie, je peux également indiquer la sérialisation attendue de l'entrée. Mais je n'ai pas trouvé comment faire ça.

Répondre

2

Cela s'est avéré être un problème relativement simple avec le plombier. La fonction postBodyFilter appelle parseQS qui se divise à son tour sur & et = et ne vérifie pas encore les formats JSON (par exemple sur la base d'un { initial et }).

Comme jsonlite était déjà importé par le paquet, j'ai proposé une petite modification pour ajouter le support JSON de base dans pull request #53.

Suivant l'exemple dans le README, ce qui suit fonctionnera après avoir ajouté ce patch:

curl --data '{"a":4, "b":5}' http://localhost:8000/sum 

Depuis l'appel est en jsonlite pour analyser le contenu de la chaîne de requête, devrait également être possible JSON plus complexe, mais Je n'ai pas encore testé ça.

Mise à jour: Cela a été fusionné dans le plumber project et travaillera pour vous si vous installez la version de github à l'aide devtools::install_github("trestletech/plumber"), ou par une installation traditionnelle dès que la version 0.3.1 est disponible sur CRAN.