415 Неподдерживаемый тип носителя Cowboy REST Ajax

У меня проблема с ковбойским REST-запросом с методом POST. Он отлично работает, если POST выполняется путем отправки содержимого формы, но он будет отвечать, когда я использую AJAX для отправки содержимого POST на сервер.

Ответ об ошибке: 415 Неподдерживаемый тип носителя.

Вот мой код для content_types_provided и content_types_accepted

content_types_accepted(Req, State) ->
    Handler = [
        {<<"text/html">>, handle_post_html},
        {{<<"application">>,<<"json">>, []}, handle_post_html},
        {{<<"text">>, <<"plain">>, []}, handle_post_html}],
    {Handler, Req, State}.

content_types_provided(Req, State)->
    Handler = [
        {<<"text/html">>, parse_html},
        {<<"application/json">>, parse_json},
        {<<"text/plain">>, parse_plain_text}],
    {Handler, Req, State}.

У кого-нибудь есть идеи по этому делу?


person Yarin Nim    schedule 03.08.2015    source источник
comment
Вы можете распечатать Req и узнать, какой тип контента он содержит. Я думаю, вам стоит использовать что-то вроде {<<"application">>, <<"x-www-form-urlencoded">>, []}   -  person P_A    schedule 03.08.2015
comment
Да, я уже добавляю его, но когда сообщение создается с помощью AJAX (XMLHTTPRequest), он отвечает 415. Но работает нормально, если сообщение создается кнопкой отправки формы.   -  person Yarin Nim    schedule 03.08.2015


Ответы (2)


Зачем это разделять?

Попытайся:

content_types_accepted(Req, State) ->
    Handler = [
        {<<"text/html">>, handle_post_html},
        {<<"application/json">>, handle_post_html},
        {<<"text/plain">>, handle_post_html}],
    {Handler, Req, State}.

content_types_provided(Req, State)->
    Handler = [
        {<<"text/html">>, parse_html},
        {<<"application/json">>, parse_json},
        {<<"text/plain">>, parse_plain_text}],
    {Handler, Req, State}.
person keroro520    schedule 04.08.2015
comment
Да, я это уже пробовал и все так же. Разделение используется, потому что мне нужно использовать методы POST и PUT, поскольку content_types_provided обрабатывает только заголовок (метод GET), а content_types_accepted обрабатывает содержимое Boby (POST, PUT). - person Yarin Nim; 04.08.2015

Чтобы ковбой понимал тип контента, отправляемого через XMLHTTPRequest (AJAX) с помощью метода POST, информацию заголовков необходимо добавить в JavaScript следующим образом:

<script language="javascript">
var content_types = {html:'text/html',json:'application/json',text:'text/plain',xml:'application/xml'};
    $(document).ready(function(){
        $('#btnPost').on('click', function(e){
            e.preventDefault();
            var href = 'http://localhost:8080/account-insert-12.html',
            var method = 'post',
            var resType = 'json'
            var postedData = $('#form').serialize();
            console.log(postedData);
            $.ajax({
                headers: {
                    'Accept': content_types[resType],
                    'Content-Type': content_types[resType] 
                },
                url:href, 
                type: method, 
                dataType: resType,
                data: postedData
            }).done(function(res){

            });
        });
    });
</script>
person Yarin Nim    schedule 04.08.2015