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
Перейдите по следующей ссылке и измените код соответствующим образом
Вы можете использовать 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}.