2014-11-14 16 views
5

Sto solo cercando di inviare una richiesta POST con JS al server. Ma il server ha una matrice vuota $_POST. Potrei usare HTTP_RAW_POST_DATA, ma sarà deprecato in PHP 5.6. Posso avere dati pubblicati nel mio array $_POST?

Ambiente: Chrome, apache2, PHP, AngularJS (sto utilizzando la funzione $http.post).

Debug image (dispiace di non attaccare direttamente l'immagine - non ho 10 reputazione)

+1

Prova ad aggiungere intestazioni: {'Content-Type': 'application/x-www-form-urlencoded'}, al tuo $ http.post? –

+0

Dov'è il tuo codice? – RichardBernards

+0

Vedere la mia [immagine di debug] (http://i.share.pho.to/c7e0e850_l.png) per il codice. Ho provato '{'Content-Type': 'application/x-www-form-urlencoded'}' ma in questo caso non ho né '$ _POST' né' HTTP_RAW_POST_DATA' sul server –

risposta

8

I dati POST devono essere nel formato query string o multipart/form-data per essere decodificati correttamente. I suoi dati sembra essere JSON, in modo da avere per decodificare da soli:

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

Anche se per usarlo esattamente come $ _POST dovremmo aggiungere true come secondo parametro a json_decode in modo che restituisca un array. $ _POST = json_decode (file_get_contents ('php: // input'), vero) – SuperNOVA

+0

Hai ragione, grazie per il tuo commento. modificato – BreyndotEchse

0

assomiglia dati JSON inviarle direttamente senza alcuna variabile provare con

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

o utilizzare una variabile sul distacco di dati come

data{'myvar': data} 

e avranno sui dati POST come

+0

Entrambi non funzionano: 1) 'file_get_contents (" php: // input ")' fornisce una stringa vuota; 2) '{'myvar': data}' ha lo stesso risultato dei dati del post originale ('$ _POST' è vuoto) –

3

$_POST viene compilato da una richiesta di tipo form-urlencoded o multipart/form-data. In genere sembra che:

foo=bar&ipsum=lorm 

Quindi un po 'come una richiesta GET.

Dal momento che si sta postando JSON direttamente (che è impressionante!) È possibile utilizzare:

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

Vedere la docs per maggiori informazioni.

+0

Perché pubblicare direttamente JSON è fantastico? (curiosità, nessuna offesa) –

+1

Perché usare la codifica del modulo sui dati JSON è problematico.I valori specificatamente vuoti non vengono trasmessi. '{" pippo ": []," bar: "baz"} 'risulterà in solo' bar = baz'. La codifica del modulo non ha modo di specificare un array vuoto – Halcyon

+1

Un array vuoto mancante potrebbe non sembrare un problema perché puoi aggiungerlo come valore predefinito, ma se hai: '{foo: [[], []]}' la codifica della form dà un risultato vuoto.Penso che questo sia un problema. – Halcyon

3

Vedi di default, jQuery trasmette i dati utilizzando Content-Type: x-www-form-urlencoded e il familiare foo=bar&baz=moeserializzazione. AngularJS, tuttavia, trasmette i dati utilizzando Content-Type: application/json e { "foo": "bar", "baz": "moe" }serializzazione JSON, che sfortunatamente alcune lingue del server Web, in particolare PHP, non vengono serializzate in modo non predefinito.

in modo da poter fare questo quando si definisce il modulo angolare:

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

risposta presa da this post by Felipe Miosso.

+0

Sì, funziona, ma non lo so, perché impostare direttamente 'Content-Type' in '$ http.post (filtersUrl, data, {headers: {'Content-Type': 'application/json; charset = utf-8 '}) 'non funziona ... Ho fatto' $ http.defaults.headers.post [' Content-Type '] =' application/json; charset = utf-8'' ed è anche lavoro –

+0

'$ http.defaults.headers.post ['Content-Type'] = 'application/json; charset = utf-8 'fa anche la stessa cosa, ma fornire come suggerito è disponibile in tutta l'applicazione che penso. – Jai

+0

E sì, in questo caso dovevo fare 'json_decode (file_get_contents ('php: // input'));' sul mio server ... –

Problemi correlati