Warum ist Yii2 rest-controller geben Antwort im XML-format?
Momentan benutze ich den folgenden code für die Initialisierung auf mein api-Modul
public function init()
{
parent::init();
Yii::$app->response->format = Response::FORMAT_JSON;
}
Mein api zurück gibt Antwort im XML-format im folgenden Beispiel.
public function actionTest()
{
$items = ['one', 'two', 'three' => ['a', 'b', 'c']];
return $items;
}
Dies ist die Antwort:
<response>
<item>one</item>
<item>two</item>
<three>
<item>a</item>
<item>b</item>
<item>c</item>
</three>
</response>
Nur so kann ich es auf der Arbeit ist, durch hinzufügen folgender Zeile zu jedem der controller-Verhalten. Ich habe die Dokumentation gelesen, die sagt, ich kann initalize diese auf der Modul-Klasse, so dass ich nicht brauchen, um es in jedem controller. Ich weiß nicht, warum gibt es XML-obwohl. Auch nur für den Fall, die einzige Möglichkeit ist das hinzufügen es zu meinem Verhalten, tun, ich habe das schreiben von code zum behandeln von name, code, status, Typ, vorherigen und code oder tut Yii bieten yii\rest\Controller und yii\rest\ActiveController, die automatisch verarbeitet diese. Klar, Sie sind die Ausgabe automatisch, wenn ein Fehler aufgetreten ist.
{"name":"Not Found"
"message":"Page not found.",
"code":0,
"status":404
"type":"yii\\web\\NotFoundHttpException"
"previous":{"name":"Invalid Route","message":"Unable to resolve the request: api/home/",
"code":0,"type":"yii\\base\\InvalidRouteException"
}
}
- Kann es sein, dass etwas anderes, wie ein Verhalten oder eine Klasse Aktion ändert sich Ihre app-Antwort-format? Sie können versuchen, var-dumping -
Yii::$app->response->format
in jede Ihrer Aktionen genau, bevor Sie einen Wert zurückgeben. - Ich bekomme das XML-Parsing-Fehler: nicht wohlgeformt Zeile Nummer 1, Spalte 7:string(3) "xml" ------^
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Yii2-Anwendungen Standard-Antwort-Typ ist XML (und ich denke, es ist der Standard für den REST auch). Während HTTP-Verbindung beide Seiten erklärt, welche Art von Daten in der Lage sind, zu senden und/oder empfangen. Wenn diese Informationen nicht weitergegeben werden, um server-Standard-Datentyp gesendet wird(auch wenn Sie angegeben haben, dass es sein sollte JSON in Ihrem app) keine Garantie für die richtige Kommunikation. Wenn Sie möchten empfangen der JSON-Daten, die Sie hinzufügen müssen
Accept: application/json
Kopf auf Ihre Anfrage. Und wahrscheinlich werden Sie nicht haben, um es zu spezifizieren, die in php-code, da Yii2 sollte, zieht es aus dem request-Header.Finden Sie weitere Erklärung, wie es funktioniert hier.
Nach drei schmerzhaften Tagen, habe ich die Lösungen. Es ist manchmal ziemlich schwierig zu erklären das problem, wenn Sie kommen aus einem ganzen JSON-Welt von ExpressJS und NodeJS. Logisch, was Yii2 tut, ist völlig in Ordnung, auf der anderen Seite 90% RESTful APIs erwarten, dass die Ausgabe im JSON-damit Sie nicht explizit festlegen möchten, auf Anfrage-Header jedes mal, wenn Sie ein API-Aufruf.
Browsern standardmäßig hinzufügen Anfrage-Header, wie "Application/XML" daher, was Sie auf dem Bildschirm sehen ist XML statt JSON.
Yii2 Inhalt Unterhändler nach Erhalt der Header, die als application/xml Formate, die Ihre Ausgabe in XML. Wenn Sie eine gleiche Anfrage mittels CURL oder Briefträger mit überschriften wie "Application/JSON" erhalten Sie die gewünschte Ausgabe.
Wenn Sie möchten, überschreiben, dieses Verhalten dann fügen Sie einfach das unten Funktion im controller und folgende Angaben enthalten:-
use yii\web\Antwort;
use yii\helpers\ArrayHelper;
JS:
Ich den code testen und es funktioniert perfekt
mein controller diese :
Ausgabe :
überprüfen Sie den namespace an, ODER senden Sie Ihren code !
init()
gehört zu meinem Modul-Klasse nicht-controller. Eigentlich ist dies immer noch geben mir die XML-Antwort.Accept: application/json
header.