2012-05-03 3 views
0

J'ai un très simple « bonjour » serveur Mochiweb (je viens de commencer mon introduction en elle), qui prend une demande JSON et renvoie:Demande simple JSON avec cURL à Mochiweb

'POST' -> 
       case Path of 
        "dummy" -> 
         Data = Req:parse_post(), 

         Json = proplists:get_value("json", Data), 

         Struct = mochijson2:decode(Json), 

         Action_value = struct:get_value(<<"action">>, Struct), 
         Action = list_to_atom(binary_to_list(A)), 

         Result = [got_json_request, Action], 

         DataOut = mochijson2:encode(Result), 
         Req:ok({"application/json",[],[Result]}); 

La chose est que lorsque je tente de faire une demande avec cURL il échoue:

curl -i -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{"action":"dummy"}' http://localhost:8080/dummy 

le journal Mochiweb est assez difficile à lire, mais que je comprends l'erreur se produit sur cette ligne:

Json = proplists:get_value("json", Data) 

J'ai mis un couple de io:format s dans le code et a découvert que les deux Data et Json sont [] après avoir fait une demande avec cURL.

D'autre part, quand je fais une demande très simple avec cURL:

curl -d '{"action":"dummy"}' http://localhost:8080/dummy 

les données et JSON sont [{"{\"action\":\"dummy\"}",[]}], mais dans ce cas, la ligne Struct = mochijson2:decode(Json) échoue.

Pour une raison étrange, Mochiweb ne voit pas les données JSON dans la requête POST dans le cas où l'en-tête a la valeur "application/json". Donc, la question est: Comment faire une requête POST correcte avec des données JSON à un serveur Mochiweb?

La variable EDIT: Json a la valeur undefined.

+4

Indépendant, mais list_to_atom est un comportement très dangereux à prendre sans s'assurer qu'il est restreint; Il y a un nombre fini d'atomes qui peuvent exister dans une instance particulière d'erlang - même si c'est très grand. – Greyson

+1

Les atomes ne sont pas collectés non plus, donc ils existent pour la durée de vie de l'application. –

Répondre

0

Essayez quelque chose le long des lignes de

Data = Req:recv_body(), 
Json = mochijson2:decode(Data), 
... 

Vous devriez au moins assurer de type après la méthode et le contenu en avance sur ce sujet.

0

Il ne s'agit pas de POST ni d'obtenir. Il est sur la façon dont vous postez vos données à envoyer à votre serveur

Lorsque vous envoyez des données JSON au serveur, vous devez le faire en tant que clé = valeur

curl -d "key=value" "http://your.domain.com/path" 

Par conséquent, si vous souhaitez publier JSON comme '{ "action": "factice"}', pour la demande GET

curl -d "json='{\"action\":\"dummy\"}'" http://localhost:8080/dummy 

pour une requête POST en tant que fichier,

curl -F "[email protected]" http://localhost:8080/dummy 

bien sûr, lorsque vous envoyez en tant que fichier, vous devez lire le fichier publié du côté serveur.