535 Stimmen

Wie kann ich Daten als Formulardaten statt als Nutzdaten einer Anfrage posten?

Im folgenden Code wird die AngularJS $http Methode ruft die URL auf und übergibt das xsrf-Objekt als "Request Payload" (wie auf der Netzwerk-Registerkarte des Chrome-Debuggers beschrieben). Die jQuery $.ajax Methode führt denselben Aufruf durch, übergibt aber xsrf als "Form Data".

Wie kann ich AngularJS xsrf als Formulardaten anstelle einer Anfrage Nutzlast zu übermitteln?

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() {}
});

7voto

aul Punkte 91
var fd = new FormData();
    fd.append('file', file);
    $http.post(uploadUrl, fd, {
        transformRequest: angular.identity,
        headers: {'Content-Type': undefined}
    })
    .success(function(){
    })
    .error(function(){
    });

Bitte zur Kasse gehen! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs

4voto

carmel Punkte 838

Für Symfony2-Benutzer:

Wenn Sie nichts in Ihrem Javascript ändern wollen, damit dies funktioniert, können Sie diese Änderungen in Ihrer Symfony-App vornehmen:

Erstellen Sie eine Klasse, die Symfony erweitert \Component\HttpFoundation\Request Klasse:

<?php

namespace Acme\Test\MyRequest;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ParameterBag;

class MyRequest extends Request{

/**
* Override and extend the createFromGlobals function.
* 
* 
*
* @return Request A new request
*
* @api
*/
public static function createFromGlobals()
{
  // Get what we would get from the parent
  $request = parent::createFromGlobals();

  // Add the handling for 'application/json' content type.
  if(0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/json')){

    // The json is in the content
    $cont = $request->getContent();

    $json = json_decode($cont);

    // ParameterBag must be an Array.
    if(is_object($json)) {
      $json = (array) $json;
  }
  $request->request = new ParameterBag($json);

}

return $request;

}

}

Verwenden Sie nun Ihre Klasse in app_dev.php (oder einer anderen Indexdatei, die Sie verwenden)

// web/app_dev.php

$kernel = new AppKernel('dev', true);
// $kernel->loadClassCache();
$request = ForumBundleRequest::createFromGlobals();

// use your class instead
// $request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

3voto

Aditya M P Punkte 4798

Ich verwende derzeit die folgende Lösung I gefunden in der AngularJS-Google-Gruppe.

$http
.post('/echo/json/', 'json=' + encodeURIComponent(angular.toJson(data)), {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
}).success(function(data) {
    $scope.data = data;
});

Beachten Sie, dass Sie, wenn Sie PHP verwenden, etwas wie die HTTP-Komponente von Symfony 2 verwenden müssen Request::createFromGlobals() um dies zu lesen, da $_POST nicht automatisch mitgeladen wird.

3voto

Merlin Ran Punkte 403

Es reicht nicht aus, nur den Content-Type zu setzen, url muss die Formulardaten vor dem Senden kodieren. $http.post(url, jQuery.param(data))

2voto

Sebastián Rojas Punkte 2649

Vollständige Antwort (seit Angular 1.4). Sie müssen die Abhängigkeit $httpParamSerializer einschließen

var res = $resource(serverUrl + 'Token', { }, {
                save: { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
            });

            res.save({ }, $httpParamSerializer({ param1: 'sdsd', param2: 'sdsd' }), function (response) {

            }, function (error) { 

            });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X