В приведенном ниже коде $http
метод AngularJS вызывает URL-адрес и отправляет объект xsrf как «Запрос полезной нагрузки» (как описано на вкладке «Сеть отладчика Chrome»). Метод jQuery $.ajax
выполняет тот же вызов, но отправляет xsrf как «Данные формы».
Как я могу заставить AngularJS отправлять xsrf как данные формы вместо полезной нагрузки запроса?
var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};
$http({
method: 'POST',
url: url,
data: xsrf
}).success(function () {});
$.ajax({
type: 'POST',
url: url,
data: xsrf,
dataType: 'json',
success: function() {}
});
ajax
angularjs
post
angular-http
mjibson
источник
источник
Ответы:
Следующая строка должна быть добавлена к переданному объекту $ http:
И переданные данные должны быть преобразованы в строку в кодировке URL:
Итак, у вас есть что-то вроде:
От: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
ОБНОВИТЬ
Чтобы использовать новые сервисы, добавленные с AngularJS V1.4, см.
источник
var xsrf = $.param({fkey: "key"});
Это глупо, почему Angular не может сделать это внутренне?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Если вы не хотите использовать jQuery в решении, вы можете попробовать это. Решение можно получить здесь https://stackoverflow.com/a/1714899/1784301
источник
for
немного изменить оператор для использованияangular.forEach
вместо него.obj[p]
не является нулевым или неопределенным . В противном случае вы в конечном итоге отправите в качестве значения строку «null» или «undefined».transformRequest: function(obj)
как obj не определен, мы предполагаем передать xsrf? НравитсяtransformRequest: function(xsrf)
Продолжающаяся путаница вокруг этой проблемы вдохновила меня написать сообщение в блоге об этом. Решение, которое я предлагаю в этом посте, лучше, чем ваше текущее решение с самым высоким рейтингом, поскольку оно не ограничивает вас параметризацией объекта данных для вызовов службы $ http; т.е. с моим решением вы можете просто продолжать передавать фактические объекты данных в $ http.post () и т. д. и при этом достигать желаемого результата.
Кроме того, ответ с самым высоким рейтингом опирается на включение полного jQuery на странице для функции $ .param (), тогда как мое решение не зависит от jQuery и полностью готово для AngularJS.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Надеюсь это поможет.
источник
ASP.NET
не «изначально» поддерживал это. Если вы не хотите изменять поведение AngularJS (что я не сделал, потому что мой API возвращает JSON, почему бы ему не принять и JSON, он более гибок, чем данные форм), вы можете прочитать изRequest.InputStream
и затем обработать его любым способом ты хочешь это. (Я решил десериализовать егоdynamic
для удобства использования.)Я взял несколько других ответов и сделал немного чище, поместил этот
.config()
вызов в конец вашего angular.module в вашем app.js:источник
unshift()
чтобы другие преобразования оставались нетронутыми. Хорошая работа.Начиная с AngularJS v1.4.0, существует встроенная
$httpParamSerializer
служба, которая преобразует любой объект в часть HTTP-запроса в соответствии с правилами, приведенными на странице документации .Это можно использовать так:
Помните, что для правильной формы сообщения,
Content-Type
заголовок должен быть изменен. Чтобы сделать это глобально для всех запросов POST, можно использовать этот код (взят из полуответа Albireo):Чтобы сделать это только для текущей публикации,
headers
необходимо изменить свойство объекта запроса:источник
transformRequest: $httpParamSerializer, data: formDataObj
. Спасибо за решение.Вы можете определить поведение глобально:
Так что вам не нужно каждый раз переопределять его:
источник
В качестве обходного пути вы можете просто заставить код, получающий POST, отвечать на данные application / json. Для PHP я добавил код, приведенный ниже, что позволяет мне POST к нему в форме в кодировке или JSON.
источник
Эти ответы выглядят как безумное излишество, иногда просто лучше:
источник
Content-Type
и установить егоapplication/x-www-form-urlencoded
.Вы можете попробовать с приведенным ниже решением
источник
Создайте сервис адаптера для почты:
Используйте его в своих контроллерах или что-то еще:
источник
Существует действительно хороший учебник, посвященный этому и другим связанным с этим материалам - Отправка форм AJAX: Путь AngularJS .
По сути, вам нужно установить заголовок запроса POST, чтобы указать, что вы отправляете данные формы в виде строки в кодировке URL, и настроить отправку данных в том же формате.
Обратите внимание, что вспомогательная функция jQuery param () используется здесь для сериализации данных в строку, но вы также можете сделать это вручную, если не используете jQuery.
источник
$.param
Сделать магию. Идеальное решение для тех, у кого есть приложение на базе jQuery + AngularJS.Пожалуйста, оформить заказ! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
источник
Для пользователей Symfony2:
Если вы не хотите ничего менять в своем javascript, чтобы это работало, вы можете внести следующие изменения в ваше приложение Symfony:
Создайте класс, который расширяет класс Symfony \ Component \ HttpFoundation \ Request:
Теперь используйте ваш класс в app_dev.php (или любом индексном файле, который вы используете)
источник
Просто установить Content-Type недостаточно, url кодирует данные формы перед отправкой.
$http.post(url, jQuery.param(data))
источник
В настоящее время я использую следующее решение, которое я нашел в группе Google AngularJS.
Обратите внимание, что если вы используете PHP, вам нужно будет использовать что-то вроде HTTP-компонента Symfony 2,
Request::createFromGlobals()
чтобы прочитать это, так как $ _POST не будет автоматически загружаться с ним.источник
AngularJS делает это правильно, так как он делает следующий тип контента внутри заголовка http-запроса:
Если вы используете php, как я, или даже Symfony2, вы можете просто расширить совместимость своего сервера со стандартом json, как описано здесь: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html.
Способ Symfony2 (например, внутри вашего DefaultController):
Преимущество заключается в том, что вам не нужно использовать параметр jQuery, и вы можете использовать AngularJS для его родного способа выполнения таких запросов.
источник
Полный ответ (начиная с углового 1.4). Вам необходимо включить зависимость de $ httpParamSerializer
источник
В конфиге вашего приложения -
С вашим запросом ресурса -
источник
Это не прямой ответ, а немного другое направление дизайна:
Не размещайте данные как форму, но как объект JSON для непосредственного сопоставления с объектом на стороне сервера или используйте переменную пути в стиле REST
Теперь я знаю, что ни один из вариантов не подходит в вашем случае, так как вы пытаетесь передать ключ XSRF. Отображение этого в переменную пути как это ужасный дизайн:
Поскольку по своей природе вы хотите передать XSRF ключа к другому пути тоже
/login
, и/book-appointment
т.д. , и вы не хотите испортить ваш довольно URLИнтересно, что добавление его в качестве поля объекта также не подходит, потому что теперь для каждого объекта json, передаваемого на сервер, необходимо добавить поле
Вы, конечно, не хотите добавлять другое поле в свой класс на стороне сервера, которое не имеет прямой семантической ассоциации с объектом домена.
На мой взгляд, лучший способ передать ваш ключ xsrf через HTTP-заголовок. Многие библиотеки веб-фреймворков на стороне сервера защиты xsrf поддерживают это. Например, в Java Spring вы можете передать его с помощью
X-CSRF-TOKEN
заголовка .Отличная возможность Angular связывать JS-объект с UI-объектом означает, что мы можем избавиться от практики публиковать формы все вместе и вместо этого публиковать JSON. JSON можно легко десериализовать в объект на стороне сервера и поддерживать сложные структуры данных, такие как карта, массивы, вложенные объекты и т. Д.
Как вы размещаете массив в форме полезной нагрузки? Может быть так:
или это:
Оба плохой дизайн ..
источник
Это то, что я делаю для своих нужд. Когда мне нужно отправить данные для входа в API в виде данных формы, а объект Javascript (userData) автоматически преобразуется в данные в формате URL.
Вот как мои пользовательские данные
источник
Единственное, что вам нужно изменить - это использовать свойство «params» вместо «data» при создании объекта $ http:
В приведенном выше примере клиенты [i] - это просто объект JSON (никак не сериализованный). Если вы используете «params» вместо «data», angular будет сериализовать объект для вас, используя $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
источник
Используйте
$http
сервис AngularJS и используйте егоpost
метод или$http
функцию настройки .источник