2013-11-08 4 views
2

Я пытаюсь выполнить аутентификацию с помощью удаленного сервиса через jQuery. Во-первых, я подтверждаю, что могу сделать это за пределами браузера:Что случилось с моим запросом POST JQuery?

curl -X POST -H "Content-Type: application/json" -H "Accept: appliction/json" -d '{"username":"...","password":"..."}' http://example.com/auth 

Это успешно возвращает токен.

Теперь попробуйте с JQuery:

$.ajax({ 
    url: "http://example.com/auth", 
    type: "POST", 
    dataType: "json", 
    contentType: "json", 
    data: {username:"...",password:"..."}, 
    error: function(data){alert(JSON.stringify(data))}, 
    success: function(data){alert(JSON.stringify(data))} 
}); 

я получаю ошибку сервера (500). Ясно, что я делаю что-то неправильно. Это мой первый попыток сделать POST в jQuery, поэтому я не знаю, как определить, в чем проблема. Что я здесь делаю неправильно?

P.S. Я могу успешно сделать запрос GET через JQuery, если у меня уже есть маркер:

$.ajax({ 
    url: "http://example.com/stuff?token=f42652adcbfe3ed9d59fae62b5267b8d", 
    type: "GET", 
    dataType: "json", 
    error: function(data){alert(JSON.stringify(data))}, 
    success: function(data){alert(JSON.stringify(data))} 
}); 
+0

почему бы вам не использовать $ .post функция? намного проще, и он использует AJAX :) –

+0

Я действительно не думаю, что ошибка сервера (500) связана с вашим запросом ajax, это, вероятно, неверная конфигурация сервера. – ProGM

+0

@ Zsigoveny: Это функционально эквивалентно этому. – David

ответ

3

Единственное, что я замечаю различие в представлениях данных. Посмотрите на данные в исходном запросе:

-d '{"username":"...","password":"..."}' 

И данные в запросе AJAX:

data: {username:"...",password:"..."} 

Прежние оборачивает ключи в строках, а второй нет. Все это тоже должно быть строкой. Попробуйте:

data: '{"username":"...","password":"..."}' 

Это было бы более последовательным с JSON formatted data в целом, я считаю. Без обертывания ключей в строках это может быть объект JavaScript, но это не данные JSON.

+0

Я пробовал как показанную вами форму, так и JSON.stringify. Я все равно получаю такую ​​же ошибку 500. – wx13

+1

@ user1073959: Есть ли способ захватить фактический HTTP-запрос, отправляемый 'curl'? Вы можете захватить HTTP-запрос для версии AJAX в средствах отладки браузера. Если вы можете сравнить два, то, возможно, это поможет найти, как они отличаются. Например, заголовок может отличаться. – David

+0

Я не знаю, как это сделать для завитки. Но я понял, как смотреть на него в firefox. Одна вещь, которую я заметил, заключается в том, что она, как сообщается, принимала «application/json», но контент был указан как «json». Я изменил contentType на «application/json», и он работает! – wx13

0

500 Внутренняя ошибка сервера

Сервер столкнулся с непредвиденным условием, которое не позволяет ему выполнить запрос.

Ответ Json от url может быть причиной, вы можете прокомментировать функцию stringfy и предупредить ответ. Вы можете использовать метод try/catch в ответ и проверить ошибку.

+0

Я удалил contentType и по-прежнему получаю 500 ошибок. Мое впечатление заключалось в том, что contentType описывал отправленные данные (которые должны быть JSON в соответствии с API), а dataType - ожидаемые возвращаемые данные (что также является JSON). – wx13

1

Обновление: oops пропустил комментарий, говорящий, что stringify не работает. Я оставлю это для потомков

Иногда вам нужно подкрепить данные при отправке Json, иначе jquery может сериализовать объект как строку param, а не как целый объект. Это зависит от того, как ваш сервер связывает запрос запроса с объектом. хоть. Можете ли вы отлаживать запрос на сервер или это из ваших рук?

Try делать (если вы на полу современный браузер):

data: JSON.stringify({ your: data}) 
0

Спасибо всем за вашу помощь. Каждый небольшой совет помог мне найти решение. Я сказал это в комментариях уже, но вот решение:

  1. типа данные правильно указан как «JSON», но CONTENTTYPE должна быть указана как «приложение/JSON».

  2. Содержимое должно быть обернуто в JSON.stringify.

0

Вы публикуете в том же домене, в котором загружен js? Если нет, вам нужно использовать jsonp и убедитесь, что сервер явно принимает ваш запрос, я считаю.

0

1) Открыть сеть в Сервис (f12)

2) Выберите "Сеть" строка

3) Выбор ошибки

4) Открыть "Тело" на стороне прав

5) В заголовке вы можете увидеть описание ошибки eq.

<title>The parameters dictionary contains a null entry for parameter 'Id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Delete(Int32)' in 'BosCatalog.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

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