2013-03-29 31 views
19

Sono nuovo alla scena e voglio utilizzare Angular.js per fare una richiesta HTTP POST. Sto accedendo agli script PHP che hanno parametri che sono solo variabili POST. Ciò che viene restituito da ogni script è una stringa JSON. Normalmente in un modulo HTML è possibile effettuare una richiesta in tal senso come:HTTP POST utilizzando Angular.js

<form method="post" action="url.php"> 
<input name="this"> 
<input name="that"> 
<input value="Submit"> 
</form> 

A seconda del vostro ingresso e dopo aver fatto clic Invia, JSON data1 tornerà qualcosa di simile: { "code" : 1 }

non ho accesso agli script o ai server che li ospitano.

Mi chiedevo se per Angular.js è possibile leggere i dati JSON1, abbinare i dati1 a quelli che sono definiti nei miei dati JSON2 e quindi inviarli alla mia vista (<pre>data2</pre>).

Per esempio, se { "code" : 1 } viene recuperato, voglio che il mio JSON per emettere il valore per il codice # 1:

{ "code" : [ 
    { 1: "User already logged in." }, 
    { 2: "Wrong parameters, try again."}, 
    { 3: "etc., etc." } 
] 
}; 

Ecco il mio tentativo:

<form ng-controller="PhpCtrl" name="f1"> 
<input type="text" name="name"> 
<input type="text" name="password"> 
<pre ng-model="codeStatus">{{codeStatus}}</pre> 
<input type="submit" ng-click="add()" value="Submit"> 
</form> 

function PhpCtrl($scope, $http, $templateCache) { 
    $scope.method = 'POST'; 
    $scope.url = 'url.php'; 
    $scope.codeStatus = ""; 

    $scope.add = function() { 

     $http({ 
      method: $scope.method, 
      url: $scope.url, 
      headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
      cache: $templateCache 
     }). 
     success(function(response) { 
      $scope.codeStatus = response.data; 
     }). 
     error(function(response) { 
      $scope.codeStatus = response || "Request failed"; 
     }); 
     return false; 
    }; 
} 

Tutto è distacco fino ad ora per la la vista è "Richiesta non riuscita" lol, sebbene stia elaborando HTTP/1.1 200. So che ho ancora un modo per andare ma apprezzerei qualsiasi aiuto. Una volta capito come inviare i dati JSON corretti1 alla vista, il passo successivo è la corrispondenza e l'output dei dati appropriati2. Grazie in anticipo!

+0

Forse la richiesta fallisce perché stai facendo una richiesta di posta senza dati con esso, prova a mettere tutti i campi modulo in un oggetto FormData e inviarlo con la richiesta aggiungendo questo 'data: FormData' come argomento alla richiesta $ http dopo aver inserito tutto il campo modulo o le intestazioni non corretta. Spero che questo aiuto. –

+0

Grazie per la risposta. Non sono sicuro se lo sto facendo bene, ma faccio semplicemente a capo dei dati del modulo in FormData come un 'oggetto JSON'? Ho provato questo http://pastebin.com/QMZSr4AZ e stava ancora elaborando l'errore "Richiesta non riuscita", quindi suppongo di non aver ancora inviato i dati. – matenji

+0

2 cose: 1) Non dovresti impostare questi valori su $ scope, $ scope è inteso per l'associazione modello e tutti i valori su di esso sono Osservati e i loro valori applicati a campi con lo stesso nome, che ha un impatto sulle prestazioni. Impostali come variabili locali come var method = 'POST', saranno usati nella funzione http come parte di una chiusura. 2) Sai come entrare nel debugger JS in Chrome/Firefox? Usalo per ispezionare la risposta. In Chrome in alto a destra> Strumenti per sviluppatori, desideri la scheda Rete e Console se aggiungi un debugger; linea per la funzione di errore. –

risposta

44

Acctually il problema è nel backend con PHP non si recuperano i dati pubblicati come di consueto, questo ha funzionato per me:

function PhpCtrl($scope, $http, $templateCache) { 
    var method = 'POST'; 
    var url = 'url.php'; 
    $scope.codeStatus = ""; 
    $scope.add = function() { 
    var FormData = { 
     'name' : document.f1.name.value, 
     'password' : document.f1.password.value 
    }; 
    $http({ 
     method: method, 
     url: url, 
     data: FormData, 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     cache: $templateCache 
    }). 
    success(function(response) { 
     $scope.codeStatus = response.data; 
    }). 
    error(function(response) { 
     $scope.codeStatus = response || "Request failed"; 
    }); 
    return false; 
    }; 
} 

nel file PHP:

$data = json_decode(file_get_contents("php://input")); 
echo $data->name; 

Spero che questo Aiuto.

+0

Yahya, lo sviluppatore ha provato a implementare quello script ma dice che non può ottenere il "nome" della proprietà da un non-oggetto. La linea (echo $ data-> name;) è necessaria? – matenji

+1

No, questo è solo un esempio, la linea precedente è quella necessaria dopo che è necessario eseguire l'elaborazione dei dati e quindi ripetere il messaggio di ritorno che si desidera. –

+0

Questo non funziona in php 5.3.13 – MACMAN

4

Una possibile alternativa è utilizzare un gestore di richieste XHR per serializzare il carico utile della richiesta POST.

$httpProvider.interceptors.push(['$q', function($q) { 
    return { 
     request: function(config) { 
      if (config.data && typeof config.data === 'object') { 
       // Check https://gist.github.com/brunoscopelliti/7492579 for a possible way to implement the serialize function. 
       config.data = serialize(config.data); 
      } 
      return config || $q.when(config); 
     } 
    }; 
}]); 

Inoltre, se non l'avete fatto prima, hai anche di cambiare il tipo di contenuto predefinito di intestazione della richiesta POST:

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

Recentemente ho scritto un post sul mio blog , dove è possibile trovare maggiori informazioni su questo approccio e XHR request interceptor.

19

Piuttosto vecchio post ... ma immagino che la mia soluzione potrebbe tornare utile anche per gli altri.

non mi piace la soluzione

json_decode(file_get_contents("php://input")); 

...Fondamentalmente perché sembra contro buone pratiche (potrei sbagliarmi su questo)

Questo è quanto ho capito risolto (adattato per l'esempio precedente)

function PhpCtrl($scope, $http, $templateCache) { 
    var method = 'POST'; 
    var url = 'url.php'; 
    $scope.codeStatus = ""; 
    $scope.add = function() { 
    var FormData = { 
     'name' : document.f1.name.value, 
     'password' : document.f1.password.value 
    }; 
    $http({ 
     method: method, 
     url: url, 
     data: $.param({'data' : FormData}), 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     cache: $templateCache 
    }). 
    success(function(response) { 
     $scope.codeStatus = response.data; 
    }). 
    error(function(response) { 
     $scope.codeStatus = response || "Request failed"; 
    }); 
    return false; 
    }; 
} 

una volta che questo fatto

data: $.param({'data' : FormData}), 
headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 

puoi accedere ai dati che normalmente utilizzeresti in PHP

$data = $_POST['data']; 
+0

buona soluzione :) – JoDiii

+0

La '$ templateCache' è davvero necessaria nei dati della richiesta? – Jago

+0

Non so se qualcosa è cambiato quando è stata data una risposta, ma $ .param() non è definito per me, quello che ho ottenuto è stato utilizzare: $ httpParamSerializerJQLike (FormData) –