AngularJs $ http.post () не отправляет данные

306

Может ли кто-нибудь сказать мне, почему следующий оператор не отправляет данные сообщения на указанный URL? URL-адрес вызывается, но на сервере, когда я печатаю $_POST, я получаю пустой массив. Если я печатаю сообщение на консоли, прежде чем добавлять его в данные - он показывает правильный контент.

$http.post('request-url',  { 'message' : message });

Я также пробовал его с данными как строку (с тем же результатом):

$http.post('request-url',  "message=" + message);

Кажется, он работает, когда я использую его в следующем формате:

$http({
    method: 'POST',
    url: 'request-url',
    data: "message=" + message,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});

но есть ли способ сделать это с $http.post() - и всегда ли я должен включать заголовок, чтобы он работал? Я считаю, что указанный тип содержимого указывает формат отправляемых данных, но могу ли я отправить его как объект javascript?

  • 0
    URL в том же происхождении?
  • 0
    Извините - да для всех примеров это один и тот же URL
Показать ещё 1 комментарий
Теги:
post
angular-http

37 ответов

305
Лучший ответ

У меня была та же проблема, что и asp.net MVC и нашли решение здесь

Существует много путаницы среди новичков AngularJS относительно того, почему $http сокращенные функции обслуживания ($http.post() и т.д.) не отображаются подкачки с jQuery эквивалентами (jQuery.post() и т.д.)

Разница заключается в том, как jQuery и AngularJS сериализовать и передать данные. По сути, проблема заключается в том, что ваш серверный язык выбора не может понять передачу AngularJSs изначально... По умолчанию jQuery передает данные с помощью

Content-Type: x-www-form-urlencoded

и знакомой сериализации foo=bar&baz=moe.

AngularJS, однако, передает данные с использованием

Content-Type: application/json 

и { "foo": "bar", "baz": "moe" }

Сериализация JSON, к сожалению, некоторые языки веб-сервера - в частности  PHP - не инициализируйте изначально.

Работает как шарм.

КОД

// Your app root module...
angular.module('MyModule', [], function($httpProvider) {
  // Use x-www-form-urlencoded Content-Type
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

  /**
   * The workhorse; converts an object to x-www-form-urlencoded serialization.
   * @param {Object} obj
   * @return {String}
   */ 
  var param = function(obj) {
    var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

    for(name in obj) {
      value = obj[name];

      if(value instanceof Array) {
        for(i=0; i<value.length; ++i) {
          subValue = value[i];
          fullSubName = name + '[' + i + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value instanceof Object) {
        for(subName in value) {
          subValue = value[subName];
          fullSubName = name + '[' + subName + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value !== undefined && value !== null)
        query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
    }

    return query.length ? query.substr(0, query.length - 1) : query;
  };

  // Override $http service default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
  }];
});
  • 7
    Я добавил этот скрипт в bower, используйте bower install angular-post-fix --save-dev чтобы добавить его.
  • 0
    так есть ли способ изменить метод передачи данных php. Потому что это проблема, с которой я сталкиваюсь сейчас.
Показать ещё 7 комментариев
111

Это не супер ясно выше, но если вы получаете запрос в PHP, вы можете использовать:

$params = json_decode(file_get_contents('php://input'),true);

Чтобы получить доступ к массиву в PHP из POST с помощью AngularJS.

  • 3
    Мне нужно было добавить true, чтобы принудительно преобразовать его в массив при перезаписи массива $ _POST. json_decode(file_get_contents('php://input'), true);
  • 0
    hacky, не следует использовать как универсальное решение
Показать ещё 2 комментария
73

Вы можете установить "Тип содержимого" по умолчанию следующим образом:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

О формате data:

Методы $http.post и $http.put принимают любой объект JavaScript (или строку) в качестве параметра данных. Если данные являются объектами JavaScript, он по умолчанию будет преобразован в строку JSON.

Попробуйте использовать это изменение

function sendData($scope) {
    $http({
        url: 'request-url',
        method: "POST",
        data: { 'message' : message }
    })
    .then(function(response) {
            // success
    }, 
    function(response) { // optional
            // failed
    });
}
  • 8
    Это не похоже на работу. Я только что попробовал вариант с данными в виде строки и: headers: {'Content-Type': 'application / x-www-form-urlencoded'} - и это, кажется, работает, но есть ли лучший способ сделать Это?
  • 2
    Установите тип содержимого по умолчанию, как описано выше, и для данных не используйте объект js. Используйте строку вроде этого: 'message =' + message Работает для меня
47

У меня была аналогичная проблема, и мне интересно, может ли это также быть полезно: https://stackoverflow.com/questions/11442632/how-can-i-post-data-as-form-data-instead-of-a-request-payload

var xsrf = $.param({fkey: "key"});
$http({
    method: 'POST',
    url: url,
    data: xsrf,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

Привет,

  • 0
    Похоже, что заголовки были единственным изменением, в котором мы нуждались. Спасибо!
  • 0
    Спасибо, что сделал это для меня :) Проблема заключалась в кодировании данных POST.
32

Мне нравится использовать функцию для преобразования объектов в post params.

myobject = {'one':'1','two':'2','three':'3'}

Object.toparams = function ObjecttoParams(obj) {
    var p = [];
    for (var key in obj) {
        p.push(key + '=' + encodeURIComponent(obj[key]));
    }
    return p.join('&');
};

$http({
    method: 'POST',
    url: url,
    data: Object.toparams(myobject),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
26

Наконец, это было рассмотрено в angular 1.4, используя $httpParamSerializerJQLike

См. https://github.com/angular/angular.js/issues/6039

.controller('myCtrl', function($http, $httpParamSerializerJQLike) {
$http({
  method: 'POST',
  url: baseUrl,
  data: $httpParamSerializerJQLike({
    "user":{
      "email":"[email protected]",
      "password":"123456"
    }
  }),
  headers:
    'Content-Type': 'application/x-www-form-urlencoded'
})})
16

Я использую параметр jQuery с сообщение AngularJS requrest. Вот пример... создайте модуль приложения AngularJS, где myapp определяется с помощью ng-app в вашем HTML-коде.

var app = angular.module('myapp', []);

Теперь создадим контроллер входа и POST-адрес электронной почты и пароль.

app.controller('LoginController', ['$scope', '$http', function ($scope, $http) {
    // default post header
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    // send login data
    $http({
        method: 'POST',
        url: 'https://example.com/user/login',
        data: $.param({
            email: $scope.email,
            password: $scope.password
        }),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (data, status, headers, config) {
        // handle success things
    }).error(function (data, status, headers, config) {
        // handle error things
    });
}]);

Мне не нравится exaplain кода, его достаточно просто понять:) Обратите внимание, что param - это jQuery, поэтому вы должны установить как jQuery, так и AngularJS, чтобы заставить его работать. Вот скриншот.

Изображение 3661

Надеюсь, это полезно. Спасибо!

9

В отличие от JQuery и ради педантизма, Angular использует формат JSON для POST передача данных с клиента на сервер (JQuery применяет, вероятно, x-www-form-urlencoded, хотя JQuery и Angular используют JSON для ввода данных). Поэтому есть две части проблемы: в клиентской части js и в вашей части сервера. Поэтому вам нужно:

  • добавить js Angular клиентскую часть следующим образом:

    $http({
    method: 'POST',
    url: 'request-url',
    data: {'message': 'Hello world'}
    });
    

И

  1. пишите в своей части сервера для получения данных от клиента (если это php).

            $data               = file_get_contents("php://input");
            $dataJsonDecode     = json_decode($data);
            $message            = $dataJsonDecode->message;
            echo $message;     //'Hello world'
    

Примечание: $_POST не будет работать!

Решение работает для меня, надеюсь, и для вас.

8

Чтобы отправить данные через почтовый метод с помощью $http угловых символов, вам нужно изменить

data: "message=" + message, с data: $.param({message:message})

  • 1
    почему при отправке данных AngularJS требуются данные: $ .param?
8

У меня была та же проблема с AngularJS и Node.js + Express 4 + Router

Маршрутизатор ожидает данные из почтового запроса в теле. Это тело всегда было пустым, если я следовал примеру из Angular Docs

Обозначение 1

$http.post('/someUrl', {msg:'hello word!'})

Но если я использовал его в данных

Обозначение 2

$http({
       withCredentials: false,
       method: 'post',
       url: yourUrl,
       headers: {'Content-Type': 'application/x-www-form-urlencoded'},
       data: postData
 });

Изменить 1:

В противном случае маршрутизатор Node.js будет ожидать данные в req.body, если используется нотация 1:

req.body.msg

который также отправляет информацию в виде полезной нагрузки JSON. Это лучше в некоторых случаях, когда у вас есть массивы в json и x-www-form-urlencoded, вы получите некоторые проблемы.

это сработало. Надеюсь, что это поможет.

7

Чтобы построить на @felipe-miosso ответ:

  • Загрузите его как модуль AngularJS из здесь,
  • Установите его
  • Добавьте его в ваше приложение:

    var app = angular.module('my_app', [ ... , 'httpPostFix']);
    
5

Этот код решил проблему для меня. Это решение на уровне приложения:

moduleName.config(['$httpProvider',
  function($httpProvider) {
    $httpProvider.defaults.transformRequest.push(function(data) {
        var requestStr;
        if (data) {
            data = JSON.parse(data);
            for (var key in data) {
                if (requestStr) {
                    requestStr += "&" + key + "=" + data[key];
                } else {
                    requestStr = key + "=" + data[key];
                }
            }
        }
        return requestStr;
    });
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
  }
]);
4

это, вероятно, поздний ответ, но я думаю, что самый правильный способ - использовать тот же кусок кода angular, который используется при выполнении запроса "get" с помощью $httpParamSerializer, должен будет ввести его на ваш контроллер поэтому вы можете просто сделать следующее, не используя JQuery, $http.post(url,$httpParamSerializer({param:val}))

app.controller('ctrl',function($scope,$http,$httpParamSerializer){
    $http.post(url,$httpParamSerializer({param:val,secondParam:secondVal}));
}
4

Добавьте это в свой файл js:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

и добавьте это в файл вашего сервера:

$params = json_decode(file_get_contents('php://input'), true);

Это должно работать.

  • 0
    один голос за меня
  • 0
    спасибо @Davit.
4

Angular

  var payload = $.param({ jobId: 2 });

                this.$http({
                    method: 'POST',
                    url: 'web/api/ResourceAction/processfile',
                    data: payload,
                    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
                });

WebAPI 2

public class AcceptJobParams
        {
            public int jobId { get; set; }
        }

        public IHttpActionResult ProcessFile([FromBody]AcceptJobParams thing)
        {
            // do something with fileName parameter

            return Ok();
        }
  • 0
    используя [FromBody] до моей модели, работал для меня.
4

У меня нет репутации, чтобы комментировать, но в ответ/дополнение к ответу "Дон Ф":

$params = json_decode(file_get_contents('php://input'));

Второй параметр true должен быть добавлен к функции json_decode для правильного возврата ассоциативного массива:

$params = json_decode(file_get_contents('php://input'), true);

3

При использовании Angular >= 1.4, здесь самое чистое решение, используя сериализатор, предоставленный Angular

angular.module('yourModule')
  .config(function ($httpProvider, $httpParamSerializerJQLikeProvider){
    $httpProvider.defaults.transformRequest.unshift($httpParamSerializerJQLikeProvider.$get());
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
});

И тогда вы можете просто сделать это в любом месте своего приложения:

$http({
  method: 'POST',
  url: '/requesturl',
  data: {
    param1: 'value1',
    param2: 'value2'
  }
});

И он будет правильно сериализовать данные как param1=value1&param2=value2 и отправить его в /requesturl с заголовком application/x-www-form-urlencoded; charset=utf-8 Content-Type, как обычно ожидается с запросами POST на конечных точках.

TL; DR

Во время моих исследований я обнаружил, что ответ на эту проблему возникает во многих разных вариантах; некоторые из них очень запутаны и зависят от пользовательских функций, некоторые зависят от jQuery, а некоторые из них неполны, предполагая, что вам нужно только установить заголовок.

Если вы просто установите заголовок Content-Type, конечная точка увидит данные POST, но не будет в стандартном формате, потому что если вы не предоставите строку в качестве data или вручную сериализуете свой объект данных, все они будут последовательно сериализованы как JSON по умолчанию и могут быть неправильно интерпретированы в конечной точке.

например. если правильный правильный сериализатор не был установлен в приведенном выше примере, это будет видно в конечной точке как:

{"param1":"value1","param2":"value2"}

И это может привести к неожиданному анализу, например. ASP.NET рассматривает его как имя параметра null, с {"param1":"value1","param2":"value2"} как значение; или Fiddler интерпретирует его другим способом, с {"param1":"value1","param2":"value2"} в качестве имени параметра и null в качестве значения.

3

Не удалось найти полный фрагмент кода о том, как использовать метод $http.post для отправки данных на сервер и почему он не работал в этом случае.

Объяснения ниже фрагмента кода...

  • Я использую функцию jQuery $.param для сериализации данных JSON для публикации данных www.
  • Настройка Content-Type в переменной конфигурации, которая будет передана вместе с запросом angularJS $http.post, который сообщает серверу, что мы отправляем данные в формате www post.

  • Обратите внимание на метод $htttp.post, где я отправляю 1-й параметр в качестве url, второй параметр в качестве данных (serialized) и третий параметр в качестве config.

Оставшийся код сам понятен.

$scope.SendData = function () {
           // use $.param jQuery function to serialize data from JSON 
            var data = $.param({
                fName: $scope.firstName,
                lName: $scope.lastName
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post('/ServerRequest/PostDataResponse', data, config)
            .success(function (data, status, headers, config) {
                $scope.PostDataResponse = data;
            })
            .error(function (data, status, header, config) {
                $scope.ResponseDetails = "Data: " + data +
                    "<hr />status: " + status +
                    "<hr />headers: " + header +
                    "<hr />config: " + config;
            });
        };

Посмотрите пример кода $http.post здесь.

3

Я использую webpervices asp.net WCF с angular js и ниже кода работал:

 $http({
        contentType: "application/json; charset=utf-8",//required
        method: "POST",
        url: '../../operation/Service.svc/user_forget',
        dataType: "json",//optional
        data:{ "uid_or_phone": $scope.forgettel, "user_email": $scope.forgetemail },
        async: "isAsync"//optional

       }).success( function (response) {

         $scope.userforgeterror = response.d;                    
       })

Надеюсь, что это поможет.

3

У меня также возникла аналогичная проблема, и я делал что-то вроде этого, и это не сработало. Мой контроллер Spring не смог прочитать параметр данных.

var paramsVal={data:'"id":"1"'};
  $http.post("Request URL",  {params: paramsVal});  

Но, читая этот форум и API Doc, я пробовал следовать за ним, и это сработало для меня. Если у кого-то тоже есть аналогичная проблема, вы можете попробовать и ниже.

$http({
      method: 'POST',
      url: "Request URL",           
      params: paramsVal,
      headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
            });

Пожалуйста, проверьте https://docs.angularjs.org/api/ng/service/ $http # сообщение для того, что делает настройка параметров. {data: ' "id": "1" '} - Карта строк или объектов, которые будут перенаправлены на URL? data = "id: 1"

3

Я знаю, имеет принятый ответ. Но последующие могут помочь будущим читателям, если ответ им не подходит по какой-либо причине.

Angular не делает ajax таким же, как jQuery. Хотя я пытался следовать руководству, чтобы изменить angular $httpprovider, я столкнулся с другими проблемами. Например. Я использую codeigniter, в котором функция $this->input->is_ajax_request() всегда терпит неудачу (которая была написана другим программистом и использовалась глобально, так что это не изменилось), заявив, что это не настоящий запрос ajax.

Чтобы решить эту проблему, я воспользовался отложенным обещанием. Я тестировал его в Firefox, и т.д., И он работал.

У меня есть следующая функция, определяемая вне любого из angular кода. Эта функция выполняет регулярный jQuery ajax-вызов и возвращает объект отложенного/обещающего (я все еще участвую).

function getjQueryAjax(url, obj){
    return $.ajax({
        type: 'post',
        url: url,
        cache: true,
        data: obj
    });
}

Затем я называю его angular кодом, используя следующий код. Обратите внимание, что мы должны обновить $scope вручную, используя $scope.$apply().

    var data = {
        media: "video",
        scope: "movies"
    };
    var rPromise = getjQueryAjax("myController/getMeTypes" , data);
    rPromise.success(function(response){
        console.log(response);
        $scope.$apply(function(){
            $scope.testData = JSON.parse(response);
            console.log($scope.testData);
        });
    }).error(function(){
        console.log("AJAX failed!");
    });

Это может быть не идеальный ответ, но он позволил мне использовать jQuery ajax-вызовы с помощью angular и разрешил мне обновлять $scope.

  • 2
    Angular имеет собственную службу обещаний $ q начиная с версии 1.3. Не нужно использовать JQuery для поста.
2

В моем случае я решаю проблему следующим образом:

var deferred = $q.defer();

$http({
    method: 'POST',
    url: 'myUri', 
    data: $.param({ param1: 'blablabla', param2: JSON.stringify(objJSON) }),
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(
    function(res) {
        console.log('succes !', res.data);
        deferred.resolve(res.data);
    },
    function(err) {
        console.log('error...', err);
        deferred.resolve(err);
    }
);
return deferred.promise;

Вам нужно использовать JSON.stringify для каждого параметра, содержащего объект JSON, а затем создать свой объект данных с помощью "$.param": -)

NB: Мой "objJSON" - это объект JSON, содержащий массив, целочисленный, строковый и html-контент. Его общий размер составляет > 3500 символов.

2

Если вы используете PHP, это простой способ получить доступ к массиву на PHP с помощью AngularJS POST.

$params = json_decode(file_get_contents('php://input'),true);
2

Я использовал код ответа (код Felipe) некоторое время, и он отлично работает (спасибо, Фелипе!).

Однако недавно я обнаружил, что он имеет проблемы с пустыми объектами или массивами. Например, при отправке этого объекта:

{
    A: 1,
    B: {
        a: [ ],
    },
    C: [ ],
    D: "2"
}

PHP, похоже, вообще не видит B и C. Он получает следующее:

[
    "A" => "1",
    "B" => "2"
]

Взгляд на фактический запрос в Chrome показывает это:

A: 1
:
D: 2

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

Я использовал TypeScript, потому что мне нравится сильная печать, но было бы легко преобразовать в чистый JS:

angular.module("MyModule").config([ "$httpProvider", function($httpProvider: ng.IHttpProvider) {
    // Use x-www-form-urlencoded Content-Type
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";

    function phpize(obj: Object | any[], depth: number = 1): string[] {
        var arr: string[] = [ ];
        angular.forEach(obj, (value: any, key: string) => {
            if (angular.isObject(value) || angular.isArray(value)) {
                var arrInner: string[] = phpize(value, depth + 1);
                var tmpKey: string;
                var encodedKey = encodeURIComponent(key);
                if (depth == 1) tmpKey = encodedKey;
                else tmpKey = `[${encodedKey}]`;
                if (arrInner.length == 0) {
                    arr.push(`${tmpKey}=`);
                }
                else {
                    arr = arr.concat(arrInner.map(inner => `${tmpKey}${inner}`));
                }
            }
            else {
                var encodedKey = encodeURIComponent(key);
                var encodedValue;
                if (angular.isUndefined(value) || value === null) encodedValue = "";
                else encodedValue = encodeURIComponent(value);

                if (depth == 1) {
                    arr.push(`${encodedKey}=${encodedValue}`);
                }
                else {
                    arr.push(`[${encodedKey}]=${encodedValue}`);
                }
            }
        });
        return arr;
    }

    // Override $http service default transformRequest
    (<any>$httpProvider.defaults).transformRequest = [ function(data: any) {
        if (!angular.isObject(data) || data.toString() == "[object File]") return data;
        return phpize(data).join("&");
    } ];
} ]);

Он менее эффективен, чем код Felipe, но я не думаю, что это имеет большое значение, поскольку оно должно быть немедленным по сравнению с общими накладными расходами самого HTTP-запроса.

Теперь PHP показывает:

[
    "A" => "1",
    "B" => [
        "a" => ""
    ],
    "C" => "",
    "D" => "2"
]

Насколько я знаю, невозможно заставить PHP распознавать, что Ba и C - пустые массивы, но, по крайней мере, появляются клавиши, что важно, когда код, который полагается на определенную структуру, даже когда он по существу пуст внутри.

Также обратите внимание, что он преобразует undefineds и nulls в пустые строки.

  • 0
    TypeScript лучший способ кодирования в POO с помощью JavaScript!
2

Только что обновленный с angular 1.2 до 1.3, нашел проблему в коде. Преобразование ресурса приведет к бесконечной петле, потому что (я думаю) из $обещания снова удерживает один и тот же объект. Может быть, это поможет кому-то...

Я мог бы исправить это:

[...]
  /**
 * The workhorse; converts an object to x-www-form-urlencoded serialization.
 * @param {Object} obj
 * @return {String}
 */
var param = function (obj) {
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

angular.forEach(obj, function(value, name) {
+    if(name.indexOf("$promise") != -1) {
+        return;
+    }

    value = obj[name];
    if (value instanceof Array) {
        for (i = 0; i < value.length; ++i) {
[...]
2

У меня была такая же проблема в express. Чтобы решить, вам нужно использовать bodyparser для синтаксического анализа объектов json перед отправкой HTTP-запросов.

app.use(bodyParser.json());
2

Когда у меня была эта проблема, параметр, который я отправлял, оказался массивом объектов вместо простого объекта.

1

Как и в OP, предложенный рабочий формат и ответ Denison, за исключением использования $http.post вместо просто $http и все еще зависит от jQuery.

Хорошая вещь об использовании jQuery здесь заключается в том, что сложные объекты передаются должным образом; от ручного преобразования в параметры URL, которые могут исказить данные.

$http.post( 'request-url', jQuery.param( { 'message': message } ), {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
1

Это не ошибка angular. angular предназначен для работы в мире JSON. Поэтому, когда служба $http отправляет запрос AJAX, он отправляет все ваши данные в качестве полезной нагрузки, а не как данные формы, чтобы ваше бэкэнд-приложение могло справиться с этим. Но jQuery делает некоторые вещи внутри себя. Вы инструктируете модуль jQuery $ajax для привязки данных формы как JSON, но перед отправкой запроса AJAX он сериализовал JSON и добавил заголовок application/x-www-form-urlencoded. Таким образом, ваше бэкэнд-приложение может получать данные формы в виде пост-параметров, а не JSON.

Но вы можете изменить поведение по умолчанию angular $http по умолчанию

  • Добавление заголовка
  • Сериализация json

$httpParamSerializerJQLike - это angular встроенный сервис, который сериализует json так же, как $.param делает jQuery.

$http({
    method: 'POST',
    url: 'request-url',
    data: $httpParamSerializerJQLike(json-form-data),
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;'
    }
});

Если вам нужен плагин для сериализации форматированных данных в JSON, сначала используйте https://github.com/marioizquierdo/jquery.serializeJSON

  • 0
    когда я пытался использовать, $ http.put ('/ api /', {name: 1}). он отправляет с сериализованными данными JSON. но для POST мне нужно установить заголовок и сериализовать данные, как вы сказали. Вы знаете, почему PUT не нуждается в этом, а нужен только POST?
  • 0
    Это невозможно.
1

Я решил это ниже:

Сторона клиента (Js):

     $http({
                url: me.serverPath,
                method: 'POST',
                data: data,
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            }).
                success(function (serverData) {
                    console.log("ServerData:", serverData);
    ......

обратите внимание, что данные являются объектами.

На сервере (ASP.NET MVC):

[AllowCrossSiteJson]
        public string Api()
        {
            var data = JsonConvert.DeserializeObject<AgentRequest>(Request.Form[0]);
            if (data == null) return "Null Request";
            var bl = Page.Bl = new Core(this);

            return data.methodName;
        }

и 'AllowCrossSiteJsonAttribute' необходим для запросов междоменных доменов:

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnActionExecuting(filterContext);
        }
    }

Надеюсь, это было полезно.

0

У меня была эта проблема, проблема заключалась в том, что я не смог получить данные во время публикации с использованием вышеупомянутого заголовка i.e.

headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded'
}

При использовании jquery Ajax мы обычно получали данные в response.body на сервере backend, но при реализации Angular ajax данные не поступали в response.body, а подпадало под

request.getParameterMap.keySet().iterator().next()
0

Предлагая обновленную версию @FelipeMiosso answer:

.config(["$httpProvider", function ($httpProvider) {

  function buildKey(parentKey, subKey) {
    return parentKey + "[" + subKey + "]";
  }

  function buildObject(key, value) {
    var object = {};
    object[key] = value;
    return object;
  }

  function join(array) {
    return array.filter(function (entry) {
      return entry;
    }).join("&");
  }

  function arrayToQueryString(parentKey, array) {
    return join(array.map(function (value, subKey) {
      return toQueryString(buildObject(buildKey(parentKey, subKey), value));
    }));
  }

  function objectToQueryString(parentKey, object) {
    return join(Object.keys(object).map(function (subKey) {
      return toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]));
    }));
  }

  function toQueryString(input) {
    return join(Object.keys(input).map(function (key) {
      var value = input[key];
      if (value instanceof Array) {
        return arrayToQueryString(key, value);
      } else if (value instanceof Object) {
        return objectToQueryString(key, value);
      } else if (undefined !== value && null !== value) {
        return encodeURIComponent(key) + "=" + encodeURIComponent(value);
      } else {
        return "";
      }
    }));
  }

  function isQueryStringEligible(input) {
    return null !== input && "object" === typeof input && "[object File]" !== String(input);
  }

  var interceptor = [function () {
    return {
      request: function (config) {
        if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
          config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
          config.data = toQueryString(config.data);
        }
        return config;
      }
    };
  }];

  $httpProvider.interceptors.push(interceptor);

}])

Версия ES6:

.config(["$httpProvider", function ($httpProvider) {

  "use strict";

  const buildKey = (parentKey, subKey) => `${parentKey}[${subKey}]`;

  const buildObject = (key, value) => ({ [key]: value });

  const join = (array) => array.filter((entry) => entry).join("&");

  const arrayToQueryString = (parentKey, array) =>
    join(array.map((value, subKey) =>
      toQueryString(buildObject(buildKey(parentKey, subKey), value))));

  const objectToQueryString = (parentKey, object) =>
    join(Object.keys(object).map((subKey) =>
      toQueryString(buildObject(buildKey(parentKey, subKey), object[subKey]))));

  const toQueryString = (input) => join(Object.keys(input).map((key) => {
    const value = input[key];
    if (value instanceof Array) {
      return arrayToQueryString(key, value);
    } else if (value instanceof Object) {
      return objectToQueryString(key, value);
    } else if (undefined !== value && null !== value) {
      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
    } else {
      return "";
    }
  }));

  const isQueryStringEligible = (input) =>
    null !== input && "object" === typeof input && "[object File]" !== String(input);

  const interceptor = [() => ({
    request(config) {
      if (0 <= ["post", "put", "patch"].indexOf(config.method.toLowerCase()) && isQueryStringEligible(config.data)) {
        config.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
        config.data = toQueryString(config.data);
      }
      return config;
    }
  })];

  $httpProvider.interceptors.push(interceptor);

}])
0

Найденное простое решение на

http://jasonwatmore.com/post/2014/04/18/post-a-simple-string-value-from-angularjs-to-net-web-api

return $http.post(Config.apiUrl + '/example/processfile', '"' + fileName + '"');
0

Просто поместите данные, которые вы хотите отправить, как второй параметр:

$http.post('request-url',  message);

Другая форма, которая также работает:

$http.post('request-url',  { params: { paramName: value } });

Убедитесь, что paramName точно соответствует имени параметра вызываемой функции.

Источник: Ускоренный метод отправки по электронной почте

  • 5
    Кто-нибудь может объяснить, почему этот ответ был отклонен?
  • 1
    От этого решения нельзя отказаться, оно самое простое, короткое и проверенное в угловой документации. Docs.angularjs.org/api/ng/service/$http.
0

Используя очень простой метод, мы можем следовать этому:

 $http({
        url : "submit_form_adv.php",
        method : 'POST',
        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 : {sample_id : 100, sample_name: 'Abin John'},

    }).success(function(data, status, headers, config) {

    }).error(function(ata, status, headers, config) {

    });
0

Я написал небольшую вспомогательную функцию PHP, которая позволяет использовать оба типа входных параметров:

function getArgs () {
    if ($input = file_get_contents('php://input') && $input_params = json_decode($input,true))
        return $input_params + $_POST + $_GET;
    return $_POST + $_GET;
}

Использование:

<?php
    include("util.php"); # above code
    $request = getArgs();

    $myVar = "";
    if (isset($request['myVar']))
        $myVar = $request['myVar'];
?>

Поэтому никаких изменений, необходимых для вашего JavaScript, не требуется.

0

используйте этот способ. нет необходимости писать так много

 isAuth = $http.post("Yr URL", {username: username, password: password});

и в конце nodejs

app.post("Yr URL",function(req,resp)
{

  var username = req.body.username||req.param('username');
  var password = req.body.password||req.param('password');
}

Я надеюсь, что это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню