我有一个非常简单的'hello world'Mochiweb服务器(我刚刚开始介绍它),它接受一个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
,发现在使用 cURL 发出请求后,Data
和Json
变量都[]
。
另一方面,当我使用 cURL 执行非常简单的请求时:
curl -d '{"action":"dummy"}' http://localhost:8080/dummy
数据和 Json 都是[{"{"action":"dummy"}",[]}]
的,但在这种情况下,行Struct = mochijson2:decode(Json)
失败。
出于某种奇怪的原因,Mochiweb在POST请求中看不到JSON数据,以防标头具有"application/json"值。
所以,问题是:如何使用 JSON 数据向 Mochiweb 服务器发出正确的 POST 请求?
编辑:Json
变量具有undefined
值。
尝试类似
Data = Req:recv_body(),
Json = mochijson2:decode(Data),
...
您至少应该确保方法发布和内容类型在此之前。
这与 POST 或 get 无关。这是关于您如何发布数据以发送到服务器
当你将一个json数据发送到服务器时,你需要把它做成key=value
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 "json=@filename.json" http://localhost:8080/dummy
当然,当您作为文件发送时,您需要从服务器端读取发布的文件。