Как отправить данные Json с помощью метода content_type_accepted в erlang в обработчике

Вот данные json

     { 
         "title": "The Title", 
         "content": "The Content" 
     }  

    curl -vX POST http://localhost:10003/sample -H "Content-Type:application/json" \ -d '{ "title": "The Title", "content": "The Content" }'
    -export([content_types_accepted/2]).
    allowed_methods(Req, State) ->  
        {[<<"GET">>, <<"POST">>], Req, State}.  

    content_types_accepted(Req, State) ->
    {[{{<<"application">>, <<"json">>, []}, welcome}], Req, State}.
    welcome(Req, State) ->
        Req_method = cowboy_req:method(Req),
        io:format("Req_method is ~p ~n", [Req_method]),
        Req_Body = cowboy_req:body(Req),
        io:format("Body is ~p ~n", [Req_Body]),
        Body = <<"<h1>This is a response for other methods</h1>">>,
        io:format("Body is  ~p ~n",[Body]),
        {Body, Req, State}.

Я вижу метод и тело, но пытаюсь поймать данные json, которые не могут этого сделать.


person KJ_kaka    schedule 22.01.2015    source источник
comment
Можете ли вы предоставить более подробную информацию? Возможно, часть кода вы уже написали? Или, может быть, объясните, что вы пробовали и почему это не удалось? Нам потребуется больше информации, чтобы дать хорошие ответы.   -  person Stratus3D    schedule 22.01.2015
comment
возможный дубликат http://stackoverflow.com/questions/19103694/simple-example-using-erlang-for-https-post   -  person Stratus3D    schedule 22.01.2015
comment
Мне очень жаль, но это не то, что я ищу. Я очень новичок в Erlang, и мне нужно использовать HTTP-метод POST с использованием content_types_accepted (для публикации), как я сделал с content_types_provide (для получения). Я потратил целый день на поиски в IRB и других блогах/форумах безрезультатно, поэтому, наконец, я разместил вопрос здесь.   -  person KJ_kaka    schedule 23.01.2015
comment
Как вы можете, я почти закончил с методом content_type_accepted, он просто застрял с перехватом значений json.   -  person KJ_kaka    schedule 23.01.2015


Ответы (3)


Я искал метод http-Post, передавая данные Json с помощью метода content_type_accepted. Вот код, который сработал для меня :)

    -export([init/3]).

    -export([welcome/2, terminate/3, allowed_methods/2]).
    -export([content_types_accepted/2]).
    init(_Transport, _Req, []) ->
        {upgrade, protocol, cowboy_rest}.
    allowed_methods(Req, State) ->  
        {[<<"POST">>], Req, State}.  
    content_types_accepted(Req, State) ->
    {[{<<"application/json">>, welcome}], Req, State}.
    terminate(_Reason, _Req, _State) ->
        ok.
    welcome(Req, State) ->
        {ok, ReqBody, Req2} = cowboy_req:body(Req),
        Req_Body_decoded = jsx:decode(ReqBody),
        [{<<"title">>,Title},{<<"content">>,Content}] = Req_Body_decoded,
        Title1 = binary_to_list(Title),
        Content1 = binary_to_list(Content),
        io:format("Title1 is ~p ~n ", [Title1]),
        io:format("Content1 is ~p ~n", [Content1]),
        io:format("Title is ~p ~n", [Title]),
        io:format("Content is ~p ~n", [Content]),
        lager:log(info, [], "Request Body", [Req_Body_decoded]),
        Res1 = cowboy_req:set_resp_body(ReqBody, Req2),
        Res2 = cowboy_req:delete_resp_header(<<"content-type">>, Res1),
        Res3 = cowboy_req:set_resp_header(<<"content-type">>, <<"application/json">>, Res2),
        {true, Res3, State}.
person KJ_kaka    schedule 23.01.2015

Сделать HTTP POST в самом Erlang очень просто. Вот простой пример, взятый из другого ответа StackOverflow:

ssl:start(),
application:start(inets),
PostBody = "{ \"title\": \"The Title\", \"content\": \"The Content\" }",
Url = "http://some.url/endpoint",
httpc:request(post, 
    {Url, [], 
    "application/x-www-form-urlencoded",
    PostBody
    }, [], []).

Надеюсь это поможет!

Эти ресурсы также кажутся полезными:

person Stratus3D    schedule 22.01.2015

Чтобы получить значения json, вы можете использовать jiffy https://github.com/davisp/jiffy.

Пример использования:

{JsonDecode} = jiffy:decode(ReqBody),
error_logger:info_msg("JSON Decoded by jiffy ", JsonDecode),

UserId = proplists:get_value(<<"userid">>, JsonDecode),
Amount = proplists:get_value(<<"amount">>, JsonDecode),
Rate = proplists:get_value(<<"rate">>, JsonDecode),
Duration = proplists:get_value(<<"duration">>, JsonDecode),
person Oladipo Olasemo    schedule 05.09.2017