Erlang Cowboy Rest Handler для запроса POST

Ответ 415 (неподдерживаемый тип носителя).

Код на стороне клиента:

$.ajax({
      url: "/book",
      //contentType: 'application/json',
      data: {action: "hello", method: "json"},
      dataType: "json",
      type: "POST",
      complete: function(a, b) {
        console.log(a);
        console.log(b);
      }
    });

Код на стороне сервера:

content_types_provided(Req, State) ->
    {[
        {<<"application/json">>, handle_to_all}
    ], Req, State}.

handle_to_all(Req, State) ->
    Body = <<"{\"rest\": \"Hello World!\"}">>,
    {Body, Req, State}.

Если я обновлю тип с "POST" на "GET" со стороны клиента, все будет в порядке.

Что-нибудь, что я пропустил?

2 ответа

Решение

Метод ковбоя content_types_provided принимает только GET и HEAD

Перейдите по следующей ссылке и измените код соответствующим образом

https://ninenines.eu/docs/en/cowboy/1.0/manual/cowboy_rest/

Вы можете использовать cowboy_rest, реализовать метод обратного вызова content_types_accepted/2 следующим образом:

 content_types_accepted(Req, State) ->
   case cowboy_req:method(Req) of
     {<<"POST">>, _ } ->
       Accepted = {[{<<"application/json">>, put_json}], Req, State};
     {<<"PUT">>, _ } ->
       Accepted = {[{<<"application/json">>, post_json}], Req, State}
   end,
 Accepted.

Я думаю, что таким образом вы можете иметь отдельные обработчики для разных HTTP-глаголов / методов. Это дает вам более чистый код тоже:)

И различные обработчики:

 %% handle http put requests
 put_file(Req, State) ->

   {true, Req, State}.
 %% handle http post requests
 post_json(Req, State) ->

   {true, Req, State}.
Другие вопросы по тегам