Как разместить 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 обеспечит эту функциональность, но как?

586   11  

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:

  1. $httpParamSerializerJQLike - сериализатор, вдохновленный jQuery .param() (рекомендовано)

  2. $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

    Ничего не найдено.