Простой запрос JSON с cURL в Mochiweb

У меня есть очень простой сервер Mochiweb «hello world» (я только начал знакомство с ним), который принимает запрос JSON и отправляет его обратно:

'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]});

Дело в том, что когда я пытаюсь сделать к нему запрос с помощью cURL, он терпит неудачу:

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

Журнал Mochiweb довольно сложно читать, но, как я понимаю, ошибка происходит в этой строке:

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

Я поместил в код пару io:format и обнаружил, что обе переменные Data и Json являются [] после того, как я сделал запрос с помощью cURL.

С другой стороны, когда я делаю очень простой запрос с помощью cURL:

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

и Data, и Json имеют значение [{"{\"action\":\"dummy\"}",[]}], но в этом случае строка Struct = mochijson2:decode(Json) не работает.

По какой-то странной причине Mochiweb не видит данные JSON в запросе POST, если заголовок имеет значение «application/json».

Итак, вопрос: как мне сделать правильный запрос POST с данными JSON на сервер Mochiweb?

РЕДАКТИРОВАТЬ: переменная Json имеет значение undefined.


person skanatek    schedule 03.05.2012    source источник
comment
Не связанный, но list_to_atom — очень опасный такт, если не убедиться, что он ограничен; Существует конечное число атомов, которые могут существовать в конкретном экземпляре эрланга, даже если он очень большой.   -  person Greyson    schedule 04.05.2012
comment
Атомы также не являются сборщиком мусора, поэтому они существуют на протяжении всего времени жизни приложения.   -  person Emil Vikström    schedule 04.05.2012


Ответы (2)


Попробуйте что-нибудь вроде

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

Вы должны, по крайней мере, обеспечить публикацию метода и тип контента перед этим.

person Tilman    schedule 04.05.2012

Это не о POST и не о получении. Речь идет о том, как вы публикуете свои данные для отправки на свой сервер.

Когда вы отправляете данные json на сервер, вам нужно сделать это как ключ = значение

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

Поэтому, если вы хотите опубликовать json как '{"action":"dummy"}', для запроса GET

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

Для POST-запроса в виде файла

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

конечно, когда вы отправляете в виде файла, вам нужно прочитать отправленный файл со стороны сервера.

person allenhwkim    schedule 08.05.2012