2014-11-14 11 views
5

Ich versuche nur eine POST Anfrage mit JS zum Server zu senden. Aber Server hat leer $_POST Array. Ich könnte HTTP_RAW_POST_DATA verwenden, aber es wird in PHP 5.6 veraltet sein. Könnte ich Daten in meinem $_POST Array veröffentlicht haben?

Umgebung: Chrome, Apache2, PHP, AngularJS (Ich verwende $http.post Funktion).

Debug image (sorry für nicht Bild Befestigung direkt - ich habe keine 10 Ruf)

+1

Versuchen Sie, Kopfzeilen hinzuzufügen: {'Content-Type': 'application/x-www-form-urlencoded'}, zu Ihrer $ http.post? –

+0

Wo ist dein Code? – RichardBernards

+0

Siehe mein [Debug Bild] (http://i.share.pho.to/c7e0e850_l.png) für Code. Ich habe '{'Content-Type': 'application/x-www-form-urlencoded'}' versucht, aber in diesem Fall habe ich weder '$ _POST' noch' HTTP_RAW_POST_DATA' auf dem Server –

Antwort

8

Die POST-Daten müssen im Format query string oder multipart/form-data vorliegen, damit sie ordnungsgemäß decodiert werden. Ihre Daten scheinen JSON zu sein, so haben Sie es zu entschlüsseln selbst:

$_POST = json_decode(file_get_contents('php://input'), true); 
+1

Obwohl, um es genau wie $ verwenden _POST sollten wir wahr als zweiten Parameter json_decode hinzufügen, so dass es ein Array zurückgibt $ _POST = json_decode (file_get_contents ('php: // input'), true);. – SuperNOVA

+0

Du hast Recht Vielen Dank für Ihren Kommentar Antwort.. bearbeitet – BreyndotEchse

0

wie direkt mit

$request = file_get_contents('php://input'); 
print_r($request); 

oder verwenden Sie eine Variable versuchen, ohne jede Variable Posting json Daten blickt auf Daten wie

veröffentlichen
data{'myvar': data} 

und wird auf POST-Daten erhalten wie

print_r($_POST['myvar']); 
+0

Beide funktionieren nicht: 1) 'file_get_contents (" php: // input ")' gibt eine leere Zeichenkette; 2) '{'myvar': data}' hat das selbe Ergebnis wie original post data ('$ _POST' ist leer) –

3

$_POST wird von einer Anforderung vom Typ form-urlencoded oder multipart/form-data ausgefüllt. Typischerweise sieht es so aus:

foo=bar&ipsum=lorm 

So ein bisschen wie ein GET Anfrage.

Da Sie Posting direkt JSON (das ist genial!) Sie verwenden können:

$request_payload = file_get_contents("php://input"); 

Siehe docs für weitere Informationen.

+0

Warum schreibt JSON direkt super? (Neugier, nichts für ungut) –

+1

Weil Formularcodierung auf JSON-Daten ist problematisch.Speziell leere Werte werden nicht übertragen. '{„Foo“[],„bar“baz"}. 'In nur' bar = baz' Formular Codierung führen keine Möglichkeit haben, ein leeres Array spezifiziert – Halcyon

+1

Ein fehlendes leeres Array erscheinen mag nicht wie ein Problem, weil. Sie können es als Standardwert hinzufügen. Aber wenn Sie haben: '{foo: [[], []]}' Formular-Codierung gibt ein leeres Ergebnis. Ich denke, das ist ein Problem. – Halcyon

3

standardmäßig anzeigen, überträgt jQuery Daten mit Content-Type: x-www-form-urlencoded und den vertrauten foo=bar&baz=moeSerialisierung. AngularJS überträgt jedoch Daten unter Verwendung Content-Type: application/json und { "foo": "bar", "baz": "moe" }JSON Serialisierung, die leider einige Web-Server-Sprachen - insbesondere PHP - nicht nativ enterialisieren.

so können Sie dies tun, wenn Sie Ihre Winkelmodul definieren:

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'; 
}); 

Antwort von this post by Felipe Miosso genommen.

+0

Ja, es funktioniert aber ich weiß nicht, warum direkte Einstellung 'Content-Type' in '$ http.post (filtersUrl, Daten, {Header: { 'Content-Type':..‚application/json; charset = utf-8 '}) 'nicht funktioniert ... ich habe tat' $ http.defaults.headers.post [' Content-Type '] =' application/json; charset = utf-8'' und es ist auch Arbeiten –

+0

'$ http.defaults.headers.post [ 'Content-Type'] =‚application/json; charset = utf-8'' macht auch das gleiche, aber die Bereitstellung wie vorgeschlagen ist in der gesamten Anwendung verfügbar, denke ich. – Jai

+0

Und ja, in diesem Fall musste ich 'json_decode (file_get_contents ('php: // input'));' auf meinem Server ... –

Verwandte Themen