2013-04-15 3 views
34

Я пытаюсь отправить запрос AJAX POST с использованием JQuery, но у меня 400 ошибок запроса.Получение ошибки 400 неправильного запроса в JQuery Ajax POST

Вот мой код:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: { 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }, 
    error: function(e) { 
    console.log(e); 
    } 
}); 

Он говорит: Не удается создать ресурс из запроса. Что мне не хватает?

+0

Предварительная проверка: Ваш браузер указывает на HTTP: // локальный: 8080 /, правильно? –

+1

Возможно, это не то, что вызывает вашу проблему, но похоже, что ["facebook: work, facebook: likes"] должно быть ["facebook: work", "facebook: likes"] – smerny

+0

Возможно, вы используете Java и Jersey? –

ответ

75

Наконец, я получил ошибку и причина была мне нужно stringify данные JSON, которые я отправлял. Я должен установить тип контента и тип данных в объекте XHR. Так правильная версия здесь:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: JSON.stringify({ 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }), 
    error: function(e) { 
    console.log(e); 
    }, 
    dataType: "json", 
    contentType: "application/json" 
}); 

Может быть, это поможет кому-то еще.

+4

Мог бы спасти себя час разочарованной отладки, если бы я нашел это для начала. Спасибо;) – bugsduggan

+5

Как однажды сказал Томас Эдисон: «Вы не потерпели неудачу, вы научились N способов, которые не будут работать» в тот час. Будьте рады, что вы не нашли его раньше и попытались решить проблему самостоятельно , – sachinjain024

+1

Это помогло мне. Зачем нужен этот шаг? – JasonTS

0

Вам необходимо создать запрос из «данных» объекта с помощью следующей функции

function buildQuery(obj) { 
     var Result= ''; 
     if(typeof(obj)== 'object') { 
      jQuery.each(obj, function(key, value) { 
       Result+= (Result) ? '&' : ''; 
       if(typeof(value)== 'object' && value.length) { 
        for(var i=0; i<value.length; i++) { 
         Result+= [key+'[]', encodeURIComponent(value[i])].join('='); 
        } 
       } else { 
        Result+= [key, encodeURIComponent(value)].join('='); 
       } 
      }); 
     } 
     return Result; 
    } 

, а затем продолжить

var data= { 
"subject:title":"Test Name", 
"subject:description":"Creating test subject to check POST method API", 
"sub:tags": ["facebook:work, facebook:likes"], 
"sampleSize" : 10, 
"values": ["science", "machine-learning"] 
} 

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: buildQuery(data), 
    error: function(e) { 
    console.log(e); 
    } 
}); 
+0

вы не «имеете», jQuery попытается сделать это за вас. Хотя, если вы его сами построите, вы можете гарантировать, что он находится в том формате, в котором вы хотите, чтобы он находился. –

+0

Не думаю, что мне нужно построить объект, используя этот способ. JQuery делает этот тяжелый подъем для меня. Более того, всякий раз, когда данные отправляются методом POST, он всегда кодируется, поэтому нам не нужно использовать encodeURIComponent над отправляемыми данными. – sachinjain024

2

Вопрос немного старый ... но на всякий случай кто-то сталкивается с ошибкой 400, это может также возникнуть из-за необходимости публиковать сообщение csrfToken в качестве параметра для запроса на отправку.

Вы должны получить имя и значение из корабля в шаблоне:

<script type="text/javascript"> 
    window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}"; 
    window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}"; 
</script> 

и передать их в запросе

data: window.csrfTokenName+"="+window.csrfTokenValue 
+0

Никто не упомянул Craft CMS здесь? –

Смежные вопросы