Как разместить urlencoded данные формы с $http без jQuery?
Я новичок в AngularJS, и для начала, я думал разработать новое приложение, используя только AngularJS.
Я пытаюсь сделать AJAX-вызов на стороне сервера, используя $http из моего углового приложения.
для отправки параметров я попробовал следующее:
$http({
method: "post",
url: URL,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $.param({username: $scope.userName, password: $scope.password})
}).success(function(result){
console.log(result);
});
это работает, но он также использует jQuery в $.param. Для удаления зависимости от jQuery, я попытался:
data: {username: $scope.userName, password: $scope.password}
но это, казалось, не. Тогда я попробовал params:
params: {username: $scope.userName, password: $scope.password}
но это казалось ошибкой. Тогда я попробовал JSON.stringify:
data: JSON.stringify({username: $scope.userName, password: $scope.password})
я нашел эти возможные ответы на мои поиски, но безуспешно. Я делаю что-то не так? Я уверен, AngularJS обеспечит эту функциональность, но как?
11 ответов:
Я думаю, что вам нужно сделать, это преобразовать ваши данные из объекта не в строку JSON, а в Параметры url.
по умолчанию служба $http преобразует исходящий запрос путем сериализация данных как JSON, а затем их публикация с содержимым- введите "application / json". Когда мы хотим разместить значение в виде формы post, нам нужно изменить алгоритм сериализации и опубликовать данные с типом контента, "application / x-www-form-urlencoded".
пример отсюда.
$http({ method: 'POST', url: url, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, transformRequest: function(obj) { var str = []; for(var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); return str.join("&"); }, data: {username: $scope.userName, password: $scope.password} }).then(function () {});обновление
чтобы использовать новые сервисы, добавленные с AngularJS V1. 4, см.
переменные url-кодирования, использующие только Службы AngularJS
С AngularJS 1.4 и выше, две службы могут обрабатывать процесс url-кодирования данных для почтовых запросов, устраняя необходимость манипулировать данными с
transformRequestили с помощью внешних зависимостей, таких как jQuery:
$httpParamSerializerJQLike- сериализатор, вдохновленный jQuery.param()(рекомендовано)
$httpParamSerializer- сериализатор, используемый самим Angular для запросов GETпример использования
$http({ url: 'some/api/endpoint', method: 'POST', data: $httpParamSerializerJQLike($scope.appForm.data), // Make sure to inject the service you choose to the controller headers: { 'Content-Type': 'application/x-www-form-urlencoded' // Note the appropriate header } }).then(function(response) { /* do something here */ });смотрите более подробную демонстрацию Plunker
как
$httpParamSerializerJQLikeи$httpParamSerializerразныев общем, кажется
$httpParamSerializerиспользует менее "традиционный" формат url-кодирования, чем$httpParamSerializerJQLikeкогда речь идет о сложных структурах данных.например (игнорируя процентное кодирование скобок):
*кодирование массива
{sites:['google', 'Facebook']} // Object with array property sites[]=google&sites[]=facebook // Result with $httpParamSerializerJQLike sites=google&sites=facebook // Result with $httpParamSerializer*кодировка объекта
{address: {city: 'LA', country: 'USA'}} // Object with object property address[city]=LA&address[country]=USA // Result with $httpParamSerializerJQLike address={"city": "LA", country: "USA"} // Result with $httpParamSerializer
все это выглядит как перебор (или не работает)... просто сделайте это:
$http.post(loginUrl, "userName=" + encodeURIComponent(email) + "&password=" + encodeURIComponent(password) + "&grant_type=password" ).success(function (data) {
проблема заключается в формате строки JSON, вы можете использовать простую строку URL в данных:
$http({ method: 'POST', url: url, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: 'username='+$scope.userName+'&password='+$scope.password }).success(function () {});
вот так и должно быть (и, пожалуйста, никаких изменений в интерфейсе ... конечно, нет ... если ваш стек не поддерживает
application/x-www-form-urlencoded, а затем выбросить его ... надеюсь, AngularJS делает !$http({ method: 'POST', url: 'api_endpoint', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: 'username='+$scope.username+'&password='+$scope.password }).then(function(response) { // on success }, function(response) { // on error });работает как шарм с AngularJS 1.5
люди, давайте дадим вам несколько советов:
использовать обещания
.then(success, error)при общении с$httpзабудь о.sucessи.errorобратные вызовы (как они устарел)С сайта angularjs здесь"вы больше не можете использовать строку JSON_CALLBACK в качестве заполнителя для указания, куда должно идти значение параметра обратного вызова."
если ваша модель данных сложнее, чем просто имя пользователя и пароль, вы все равно можете это сделать (как предлагалось выше)
$http({ method: 'POST', url: 'api_endpoint', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: json_formatted_data, transformRequest: function(data, headers) { return transform_json_to_urlcoded(data); // iterate over fields and chain key=value separated with &, using encodeURIComponent javascript function } }).then(function(response) { // on succes }, function(response) { // on error });документ
encodeURIComponentможно найти здесь
С $http docs это должно работать..
$http.post(url, data,{headers: {'Content-Type': 'application/x-www-form-urlencoded'}}) .success(function(response) { // your code... });
Если это форма попробуйте изменить заголовок на:
headers[ "Content-type" ] = "application/x-www-form-urlencoded; charset=utf-8";и если это не форма, а простой json, то попробуйте этот заголовок:
headers[ "Content-type" ] = "application/json";
вам нужно разместить простой объект javascript, ничего больше
var request = $http({ method: "post", url: "process.cfm", transformRequest: transformRequestAsFormPost, data: { id: 4, name: "Kim" } }); request.success( function( data ) { $scope.localData = data; } );если у вас есть php в качестве серверной, то вам нужно сделать еще несколько изменений.. оформить заказ этой ссылке для исправления php на стороне сервера
хотя поздний ответ, я нашел angular UrlSearchParams работал очень хорошо для меня, он также заботится о кодировании параметров.
let params = new URLSearchParams(); params.set("abc", "def"); let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded'}); let options = new RequestOptions({ headers: headers, withCredentials: true }); this.http .post(UrlUtil.getOptionSubmitUrl(parentSubcatId), params, options) .catch();
$http({ method: "POST", url: "/server.php", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: "name='Олег'&age='28'", }).success(function(data, status) { console.log(data); console.log(status); });
это работает для меня. Я использую угловые для переднего плана и что Laravel PHP для серверной. В мой проект, угловая веб-отправляет JSON-данные, чтобы фреймворк Laravel админцентр.
Это мой угловой контроллер.
var angularJsApp= angular.module('angularJsApp',[]); angularJsApp.controller('MainCtrl', function ($scope ,$http) { $scope.userName ="Victoria"; $scope.password ="password" $http({ method :'POST', url:'http://api.mywebsite.com.localhost/httpTest?callback=JSON_CALLBACK', data: { username : $scope.userName , password: $scope.password}, headers: {'Content-Type': 'application/json'} }).success(function (data, status, headers, config) { console.log('status',status); console.log('data',status); console.log('headers',status); }); });Это мой php back-end Laravel контроллер.
public function httpTest(){ if (Input::has('username')) { $user =Input::all(); return Response::json($user)->setCallback(Input::get('callback')); } }Это мой маршрут laravel
Route::post('httpTest','HttpTestController@httpTest');результат в браузере
статус 200
данные JSON_CALLBACK({"имя":"Виктория","пароль":"пароль","обратный вызов":"JSON_CALLBACK"}); httpTesting.js: 18 функция заголовков (c){a||(a=sc (b)); возврат с?a[K (c)]||null:a}есть расширение chrome называется почтальон. Вы можете использовать для проверки вашего внутреннего url-адреса, работает ли он или нет. https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en
надеюсь, мой ответ поможет вам.
Comments