2017-12-05 7 views
0

Ich versuche eine PUT-Anfrage an eine Philips Hue-Bridge zu senden, damit ich den aktuellen Status der Lampe ändern kann. Ich mache das von einem Webserver auf meinem PC. Mit CORS habe ich bereits eine GET- und POST-Anfrage gesendet, aber wenn ich eine PUT sende, bekomme ich einen Fehler, der sagt "Methode nicht gefunden in Access-Control-Allow-Methoden". Ich bin mir ziemlich sicher, dass es keinen Sinn machen würde, nur diese Methode zu blockieren.kann PUT nicht an Philips senden Hue (selbe Ursprungsrichtlinie)

Ich verwende diesen Code, um es zu tun, es ist der gleiche wie der Code für GET und POST, nur die If-Klausel wird nicht benötigt.

var lightReq = new XMLHttpRequest(); 
 

 
\t \t if ("withCredentials" in lightReq) { 
 
\t \t \t lightReq.open('PUT',stringChange,true); 
 
\t \t \t if (value == false) { 
 
\t \t \t \t lightReq.send("{\"on\":true}"); 
 
\t \t \t } 
 
\t \t \t else { 
 
\t \t \t \t lightReq.send("{\"on\":false}"); 
 
\t \t \t } 
 
\t \t }

Vielleicht hatte jemand ein ähnliches Problem und bekam eine Lösung, oder es sind Schritte, die ich überprüfen sollten. Ich freue mich für jede Hilfe.

EDIT: Hier ist ein Screenshot der Kopfzeile, es zeigt, dass die PUT-Methode akzeptiert werden sollte. Screenshot of the header

EDIT2: Für roryhewitt hier ist das, was Sie gefragt, denke ich: enter image description here

Mit besten Grüßen, Adrian

+2

Dieser Fehler bedeutet, dass der Server (die Hue-Brücke, ich nehme an) einen 'Access-Control-Allow-Methods'-Header zurückgibt, der die" PUT "-Methode nicht enthält. Sie sollten dies über die Entwicklertools Ihres Browsers überprüfen können, wo Sie die CORS-Anfrage vor dem Flug sehen, die automatisch (vom Browser) ausgeführt wird, bevor Ihr "PUT" versucht wird. – Pointy

+0

Der Grund dafür, dass Ihre GET- und POST-Anfragen bearbeitet wurden, ist wahrscheinlich, dass es sich um einfache Anfragen handelte, die keine benutzerdefinierten Anfragenheader enthielten und daher keine COROR-Preflight-OPTIONS-Anfrage von Ihrem Browser ausgelöst haben. PUR-Anfragen mit übergreifendem Ursprung führen jedoch immer dazu, dass Browser Preflight ausführen - was, wie @ Pointy sagt, fehlschlägt, wenn der Antwort-Header "Access-Control-Allow-Methods" nicht "PUT" enthält. – sideshowbarker

+0

wie zu meinem Beitrag hinzugefügt, der Netzwerk-Scanner des Browsers zeigt, dass die PUT-Methode akzeptiert werden sollte. Oder bin ich fehlgeleitet? – DaPole

Antwort

0

es von Ihrem Screenshot sieht aus, als wenn das die Antwort auf eine POST-Anfrage (Ich stehe auf dem Anfragemethode Feld)? Die meisten dieser CORS-Antwortheader (außer ACAC) sollten nur in der Antwort auf eine Preflight-OPTIONS-Anfrage zurückgegeben werden - sie haben keine Bedeutung, wenn sie in der Antwort auf eine andere Anfrage zurückgegeben werden. Das ist die "Schuld" der Brücke, aber nichts, was Sie im Browsercode tun.

Wenn Ihr JS-Code eine PUT-Anfrage über XMLHttpRequest absetzt, sollten Sie, wenn Sie sich den Netzwerkverkehr von Ihrem Browser ansehen, OPTIONS-Anfragen (CORS-Preflight) gefolgt von Ihrer PUT-Anfrage sehen. Wenn Sie nur die OPTIONS-Anfrage sehen, können Sie die Antwort-Header für diese Anfrage angeben?

+0

Ich habe ein neues Bild in meinem Hauptpost hinzugefügt. Soweit ich es verstehe, sollte es erlaubt sein, oder irre ich mich? – DaPole

+0

Wenn ich Ihren zweiten Screenshot verstehe, sind der obere Abschnitt die Anforderungsheader für die PUT und der untere Abschnitt die Antwortheader gefolgt von den Anforderungsheadern für die OPTIONEN, richtig? Also wird die PUT-Anfrage gemacht (was nicht passieren würde, wenn die Preflight-OPTIONEN dies nicht erlauben würden). Ich denke, das Problem hier ist, dass Sie Anmeldeinformationen verwenden, aber Sie geben zurück, Access-Control-Allow-Origin: * '- Wenn Sie Anmeldeinformationen verwenden, müssen Sie die EXACT-Ursprungsanforderung Kopfzeile, z. 'Zugriffskontrolle-Erlauben-Ursprung: http: // localhost'. Kannst du versuchen, das anstatt * zurückzuschicken? – roryhewitt

+0

Das Zurücksenden würde bedeuten, dass ich die Parameter auf der Philips Hue Bridge ändern muss, wie ich richtig verstanden habe. Aber das ist keine Option, ich habe keinen Zugriff auf die Bridge-Konfiguration. Oder missverstehe ich dich? Außerdem habe ich es aus einem einfachen HTML auf einem Webserver ausprobiert und es funktioniert, also schätze ich es hat mit Einschränkungen zu tun, die das FireHbbTV-Plugin auf CORS hat. – DaPole

Verwandte Themen