2017-02-17 3 views
1

In meiner lokalen Umgebung verwende ich PHP7 und ich habe eine Restful API für eine AngularJS-Anwendung entwickelt. Ich brauche eine get-Anforderung an den Api zu tun und ein Array als Parameter übergeben, also tat ich es:Übergabe eines Arrays als Parameter an PHP Restful Api mit AngularJS

$http.get("/Api/MyUrl.php", { 
    params: { 
     "Names[]": ["Foo", "Bar"] 
    } 
}) 
.then(function(response){ //fires in success 
    console.log(response.data); 
}, function(response){ //fires in error 
    console.log(response.statusText);   
}); 

In MyUrl.php Datei gedruckt ich die Parameter auf dem Bildschirm wie folgt aus:

<?php 
    print_r($_GET); 
?> 

Als es ausgeführt wurde, wurde genau das, was ich mir vorgestellt hatte, auf der Browser-Konsole ausgedruckt:

Array 
(
    [Names] => Array 
     (
      [0] => Foo 
      [1] => Bar 
     ) 

) 

Bis hier gibt es kein Problem. Aber, wenn ich die Anwendung auf dem Server, die nur die PHP-Version 5.6 unterstützt (ich weiß nicht, ob es korreliert ist, aber ich denke schon), der Parameter mit dem Array wird von der PHP auf eine andere Weise, und was gedruckt wird, auf der Konsole ist, dass:

Array 
(
    [Names%5B%5D] => Bar 
) 

It "undestands" die [] Signale als HTML-Codes (% 5B und 5D%), nur das letzte Element des Arrays erhalten und interpretiert als commom Variable.

Was muss ich tun, um die Parameter im Server auf dieselbe Weise zu lesen wie in der lokalen Umgebung?

Antwort

1

Gute Frage. Ich schlage vor, Sie überprüfen this old issue in angularjs Projekt, wo es liest:

Es gibt keinen bestimmten Standard für wie Arrays in Abfragezeichenfolgen serialisiert werden sollten. Verschiedene Backends erwarten unterschiedliche Formate. Diese aktuelle Methode (in 1.1.x) wurde speziell gewählt, weil sie dem Entwickler die größte Flexibilität bietet.

Die Art und Weise Sie params $http.get() sind vorbei scheint für php7.0 zu arbeiten, weil php7.0 intelligent genug sein kann, folgern, dass Klammern übergeben werden. Tatsache ist jedoch, dass die Abfragezeichenfolge in Ihrem eckigen Code nicht ordnungsgemäß URI-codiert ist und daher nicht mit Ihrem Server übereinstimmt.

Interessanterweise ein ähnliches Problem hat here die Antwort, auf die Dokumentation von jQuery berichtet verweist, die das gleiche Verhalten hat:

Da es keine allgemein vereinbarte wird Spezifikation für param Strings, ist es nicht möglich, komplexe Datenstrukturen mit dieser Methode so zu kodieren, dass sie in allen Sprachen, die solche Eingaben unterstützen, optimal funktionieren. Verwenden Sie stattdessen das JSON-Format für die Kodierung komplexer Daten.

Was ist die Lösung?

Zunächst einmal können Sie versuchen URI-encoding Ihre Parameter.

Eine andere Lösung wäre, um Ihre Abfrage als json codierte Daten zu übergeben:

$http.get("/Api/MyUrl.php", { 
    params: { 
     "data": JSON.stringify({'names': {'Foo', 'Bar'}}) 
    } 
}) 

und json_decode($_GET['data']) Ihre Parameter in Backend zugreifen.

Und schließlich können Sie AngularJS's paramSerializer nutzen, um Ihren eigenen Serializer zu definieren und Ihre Parameter wie gewohnt zu übergeben. In diesem speziellen Fall wird paramSerializerJQLike nützlich sein:

$http.get("/Api/MyUrl.php", { 
    params: { 
     "Names[]": ["Foo", "Bar"] 
    } 
    paramSerializer: '$httpParamSerializerJQLike' 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}) 
Verwandte Themen