У меня есть старый код, который делает запрос AJAX POST через метод jQuery post и выглядит примерно так:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
это просто объект javascript с некоторыми основными строковыми свойствами.
Я сейчас перехожу на использование Angular и хочу заменить этот вызов на $ http.post. Я придумал следующее:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Когда я сделал это, я получил от сервера ответ об ошибке 500. Используя Firebug, я обнаружил, что это отправляет тело запроса следующим образом:
{"param1":"value1","param2":"value2","param3":"value3"}
Успешный jQuery $.post
отправляет тело следующим образом:
param1=value1¶m2=value2¶m3=value3
Конечная точка, на которую я обращаюсь, ожидает параметры запроса, а не JSON. Итак, мой вопрос: есть ли способ $http.post
отправить объект javascript в качестве параметров запроса вместо JSON? Да, я знаю, что могу построить строку самостоятельно из объекта, но я хочу знать, предоставляет ли Angular что-нибудь для этого из коробки.
источник
$httpProvider.defaults
, он не работает, есть ли подсказка об этом?Cannot read property "jquery" of undefined.
Как это исправить? PS. Преобразования по вызову работают.Если вы используете Angular> = 1.4 , вот самое чистое решение, которое я нашел, которое не полагается ни на что настраиваемое или внешнее:
И тогда вы можете сделать это в любом месте вашего приложения:
И он будет правильно сериализовать данные как
param1=value1¶m2=value2
и отправить их/requesturl
сapplication/x-www-form-urlencoded; charset=utf-8
заголовком Content-Type, как обычно ожидается с запросами POST на конечных точках.источник
Из документации AngularJS:
Итак, укажите строку в качестве параметров. Если вы этого не хотите, используйте преобразования. Опять же из документации:
Обратитесь к документации для получения более подробной информации.
источник
Используйте
$.param
функцию jQuery для сериализации данных JSON в requestData.Короче говоря, используя код, похожий на ваш:
Чтобы использовать это, вы должны включить jQuery на свою страницу вместе с AngularJS.
источник
Обратите внимание, что начиная с Angular 1.4 вы можете сериализовать данные формы без использования jQuery.
В app.js:
Затем в вашем контроллере:
источник
Это может быть чем-то вроде взлома, но я избежал этой проблемы и преобразовал json в массив PHP POST на стороне сервера:
источник
У меня также есть проблемы с настройкой пользовательской HTTP-аутентификации, потому что $ resource кеширует запрос.
Чтобы заставить его работать, вам нужно перезаписать существующие заголовки, выполнив это
Надеюсь, я смог кому-то помочь. Мне потребовалось 3 дня, чтобы понять это.
источник
Измените заголовки по умолчанию:
Затем используйте
$.param
метод JQuery :источник
источник
Быстрая настройка - для тех из вас, у кого проблемы с глобальной конфигурацией функции transformRequest, вот фрагмент, который я использую, чтобы избавиться от
Cannot read property 'jquery' of undefined
ошибки:источник
Вы также можете решить эту проблему без изменения кода на сервере, изменения заголовка при
$http.post
вызове и использования$_POST
обычного способа. Объясняется здесь: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/источник
Я много раз обнаруживал проблемное поведение этого целого. Я использовал его из express (без типизации) и bodyParser (с типами dt ~ body-parser).
Я не пытался загрузить файл, а просто интерпретировал JSON, указанный в строке сообщения.
Это
request.body
был просто пустой json ({}
).После долгих исследований это сработало для меня:
Также может быть важно
application/json
указать тип содержимого в строке запроса со стороны клиента.источник
Синтаксис для AngularJS v1.4.8 + (v1.5.0)
Например:
источник