javascript - form - angularjs http post serialized data



AngularJS-Qualquer forma de $ http.post enviar parâmetros de requisição em vez de JSON? (9)

Eu tenho algum código antigo que está fazendo uma requisição AJAX POST através do método post do jQuery e se parece com isso:

$.post("/foo/bar", requestData,
    function(responseData)
    {
        //do stuff with response
    }

requestData é apenas um objeto javascript com algumas propriedades básicas de string.

Estou no processo de mover nossas coisas para usar o Angular e quero substituir essa chamada por $ http.post. Eu vim com o seguinte:

$http.post("/foo/bar", requestData).success(
    function(responseData) {
        //do stuff with response
    }
});

Quando fiz isso, recebi uma resposta de erro 500 do servidor. Usando o Firebug, descobri que isso enviou o corpo da solicitação assim:

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

O sucesso do jQuery $.post envia o corpo assim:

param1=value1&param2=value2&param3=value3

O endpoint que estou atingindo está esperando parâmetros de solicitação e não JSON. Então, a minha pergunta é se há $http.post maneira de dizer $http.post para enviar o objeto javascript como parâmetros de solicitação em vez de JSON? Sim, eu sei que eu poderia construir a string eu mesmo a partir do objeto, mas eu quero saber se Angular fornece algo para isso fora da caixa.

https://ffff65535.com


Ajuste rápido - para aqueles que estão tendo problemas com a configuração global da função transformRequest, aqui está o trecho que estou usando para me livrar da Cannot read property 'jquery' of undefined erro Cannot read property 'jquery' of undefined :

$httpProvider.defaults.transformRequest = function(data) {
        return data != undefined ? $.param(data) : null;
    }

Da documentação do AngularJS:

params - {Object.} - Mapa de strings ou objetos que serão transformados em? key1 = value1 & key2 = value2 após o url. Se o valor não for uma string , será JSONified.

Então, forneça string como parâmetros. Se você não quiser isso, use transformações. Mais uma vez, a partir da documentação:

Para substituir essas transformações localmente, especifique as funções de transformação como propriedades transformRequest e / ou transformResponse do objeto de configuração. Para substituir globalmente as transformações padrão, sobrescreva as propriedades $ httpProvider.defaults.transformRequest e $ httpProvider.defaults.transformResponse do $ httpProvider.

Consulte a documentation para mais detalhes.


Eu encontrei muitas vezes um comportamento problemático desse todo. Eu usei de express (sem typings) e o bodyParser (com os tipificadores dt ~ body-parser).

Eu não tentei fazer o upload de um arquivo, apenas para interpretar um JSON dado em uma string de postagem.

O request.body era simplesmente um json vazio ( {} ).

Depois de muita investigação, finalmente, isso funcionou para mim:

import { json } from 'body-parser';
...
app.use(json()); <-- should be defined before the first POST handler!

Também pode ser importante fornecer o tipo de conteúdo application/json na string de solicitação do lado do cliente.


Eu também tenho problemas com a configuração da autenticação http personalizada porque o $ resource cache é o pedido.

Para fazê-lo funcionar você tem que substituir os cabeçalhos existentes, fazendo isso

var transformRequest = function(data, headersGetter){
  var headers = headersGetter();
  headers['Authorization'] = 'WSSE profile="UsernameToken"';
  headers['X-WSSE'] = 'UsernameToken ' + nonce
  headers['Content-Type'] = 'application/json';
};

return $resource(
  url,
    {
    },
    {
      query: {
        method: 'POST',
        url: apiURL + '/profile',
        transformRequest: transformRequest,
        params: {userId: '@userId'}
      },
    }
);

Espero poder ajudar alguém. Demorei 3 dias para descobrir isso.


Modifique os cabeçalhos padrão:

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

Em seguida, use o método $.param do JQuery:

var payload = $.param({key: value});
$http.post(targetURL, payload);

Observe que, a partir do Angular 1.4, você pode serializar os dados do formulário sem usar o jQuery.

No app.js:

module.run(function($http, $httpParamSerializerJQLike) {
  $http.defaults.transformRequest.unshift($httpParamSerializerJQLike);
});

Então no seu controlador:

$http({
    method: 'POST',
    url: myUrl',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: myData
});

Sintaxe para AngularJS v1.4.8 + (v1.5.0)

       $http.post(url, data, config)
            .then(
                    function (response) {
                        // success callback
                    },
                    function (response) {
                        // failure callback
                    }
            );

Por exemplo:

    var url = "http://example.com";

    var data = {
        "param1": "value1",
        "param2": "value2",
        "param3": "value3"
    };

    var config = {
        headers: {
            'Content-Type': "application/json"
        }
    };

    $http.post(url, data, config)
            .then(
                    function (response) {
                        // success callback
                    },
                    function (response) {
                        // failure callback
                    }
            );

Use a função $.param do jQuery para serializar os dados JSON em requestData.

Em suma, usando código semelhante ao seu:

$http.post("/foo/bar",
$.param(requestData),
{
    headers:
    {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
}
).success(
    function(responseData) {
        //do stuff with response
    }
});

Para usar isso, você precisa incluir o jQuery em sua página junto com o AngularJS.


   .controller('pieChartController', ['$scope', '$http', '$httpParamSerializerJQLike', function($scope, $http, $httpParamSerializerJQLike) {
        var data = {
                TimeStamp : "2016-04-25 12:50:00"
        };
        $http({
            method: 'POST',
            url: 'serverutilizationreport',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            data: $httpParamSerializerJQLike(data),
        }).success(function () {});
    }
  ]);




angularjs