2015-05-20 6 views
7

Ich versuche, eine REST-API in einer erweiterten Yii2-Anwendung für die Verwaltung einfacher Abfragen an meine Datenbank zu erstellen. Befolgen Sie einige Tutorials, erstellen Sie Schritt für Schritt das Beispiel in der Anleitung, im Schnellstart, und lassen Sie mein Modell für GET- und HEAD-Methoden arbeiten.Yii2 REST geben eine 405 auf POST, PUT, etc

Erstellt meinen API Service innerhalb eines Moduls, richtig gesetzt, mit minimalen Einstellungen, Anfrage JSON Parser auf Backend/main.php, registriert das Modul in common/main.php und erstellt die Regel in urlManager auch dort (unter dem minimalen üblichen Regeln, enablePrettyUrl, controller/action, ...):

['class' => 'yii\rest\UrlRule', 'controller' => ['precapi']] 

Aber immer, wenn ich ein paar andere Methoden versucht, über CURL oder Postman REST-Client, es gibt mir immer einen Fehler:

Method Not Allowed. This url can only handle the following request methods: GET, HEAD.

Ich denke ich h Ich habe schon so viele verschiedene Konfigurationen und Wege versucht, um es zu lösen, aber ohne Ergebnis. Einzige Sache ist 'enableStrictParsing' => false' in UrlManager, weil es mir einen 404 Fehler auf einigen URLs gibt, und POST funktioniert nicht mit diesem auch, obwohl die Anwendung wie üblich arbeitet.

Jede Hilfe wird geschätzt. Grüße.

Antwort

5

Ohne weitere Informationen darüber, was Ihr Precapi-Controller basiert, gehe ich davon aus, dass es von \yii\rest\ActiveController abgeleitet ist?

Wenn ja, könnten Sie wat die verbs() -Funktion in Ihrem Controller außer Kraft zu setzen: Die Default-Implementierung ist dies:

protected function verbs() 
{ 
    return [ 
     'index' => ['GET', 'HEAD'], 
     'view' => ['GET', 'HEAD'], 
     'create' => ['POST'], 
     'update' => ['PUT', 'PATCH'], 
     'delete' => ['DELETE'], 
    ]; 
} 

Ich denke, Ihre Kommentare gegeben, dass es tatsächlich ein kleines Problem mit der urlManager Konfiguration, also ging ich die Dinge zurück und sah, dass Sie den Controller zu einem Modul hinzugefügt.
The manual has this to say:

The controller ID (e.g. user, post-comment) that the rules in this composite rule are dealing with. It should be prefixed with the module ID if the controller is within a module (e.g. admin/user).

das könnte das Problem sein?

+0

Dank aufgelöst. Ja, es wird von ActiveController abgeleitet. Aber ich glaube, es sollte standardmäßig ohne weitere Methoden funktionieren, wie in der Dokumentation geschrieben. Namespace-App \ Module \ Controller; verwenden Sie yii \ rest \ ActiveController; Klasse DefaultController erweitert ActiveController UND dort nur das Modell aus der Tabelle instanziieren. Will versuchen und es euch wissen lassen. – user3627496

+0

Gleiche Ergebnisse mit dieser Implementierung. Danke trotzdem. – user3627496

+0

Die Idee ist, dass Sie die Implementierung ändern und 'POST' hinzufügen. Ich habe gerade den Standard als Beispiel hinzugefügt – Blizz

7

ich denke, ist Thema pluralize, versuchen Sie diese

['class' => 'yii\rest\UrlRule', 'controller' => 'precapi', 'pluralize'=>false], 
0

ich zu diesem Thema bin zu fragen, weil ich es hatte und getötet den ganzen Tag lang die Lösung zu finden. Ich war sehr dumm. Es ist kein Problem von YII2-Framework, aber es ist ein Curl-Problem. Nicht das Problem mit einigen Controllern, Aktionen oder Verhaltensweisen, aber mit Rechtschreibung Curl-Befehl.

Hier falschen Befehl ist - löschen oder Arbeits setzen nicht und hob 405 Fehler:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -XDELETE "http://test.test.in/test "-d '{ "myid": "2"}'

HTTP/1.1 405 Methode nicht erlaubt Server: nginx/1.8.1 Date: Sun, 26. Juni 2016 07.47.51 GMT Content- Geben Sie Folgendes ein: application/json; charset = UTF-8 Content-Length: 0 Verbindung: keep-alive X-Powered-By: PHP/5.6.22 Allow: GET, POST, HEAD, OPTIONS

Und hier ist richtig und richtig curl Befehl: curl -i -H "Accept: application/json" -H "Content-Type: application/json" - XDELETE "http://test.test.in/test/2"

HTTP/1.1 204 No Content Server: nginx/1.8.1 Date: Sun, 26. Juni 2016 07.49.19 GMT Content-Type: application/json; charset = UTF-8 Content-Length: 0 Verbindung: Keep-Alive- X-Powered-By: PHP/5.6.22

Das ist alles, viel Glück ist!

0

Ich wollte mögliche Problem und Lösung, die ich heute angetroffen habe hinzufügen. Die extra mit / in URL etwas wie http://localhost:8080/index.php/module/controller_id/?access-token=_token_here

Hinweis, wie subtil / in URL nach dem Controller_ID ist

Das ist mein Problem war und ich durch das Entfernen zusätzlichen /

Verwandte Themen