dedlfix: Unerwartetes Verhalten bei JSONP-Request mit jQuery/Ajax

Beitrag lesen

Tach!

Die Abfrage wollte ich mit JSONP realisieren, da bei einem reinen Ajax/jQuery-Request der fehlende "Allow-Origin" Header problematisch ist.

JSONP ist kein 1:1-Ersatz zu einen Ajax-Request, der unter der Cross-Origin-Policy leidet. Eine für JSONP geeignete Response muss ihr Ergebnis in einen Funktionsaufruf eingebettet haben. Das ist das P an der Geschichte.

JSON-Response: {"x": "Foo", "y": "Bar"}

JSONP-Response: jsonpCallback({"x": "Foo", "y": "Bar"});

Leider scheint Jira ein Problem mit diesem Request zu haben, denn in der Browser-Konsole wird folgende Fehlermeldung angezeigt:

Der Server muss verstehen, dass du JSONP haben möchtest, und entsprechend handeln. Er kann nicht einfach so sein übliches JSON liefern.

Refused to execute script from 'http://[domain]/rest/agile/1.0/board/[boardNr]/issue?callback=jsonpCallback' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.

Die AUsführung wird also schon wegen flaschen MIME-Types abgelehnt, weil Code und nicht Daten erwartet werden.

Mein Problem an der Sache ist bloß, wenn ich die URL direkt im Browser aufrufe oder mit der Chrome-Erweiterung Postman darauf zugreife, erhalte ich die gewünschte JSON-Datei als Response.

Ja, JSON, aber nicht JSONP. Und beim Direktaufruf stört auch keine Cross-Origin-Policy.

Mein Problem liegt nun darin, dass ich nicht weiß, wie ich auf den scheinbar fehlerfreien Response zugreifen kann.

Es geht nicht ohne Zutun des Servers / der Anwendung auf dem Server. Wenn du auf den Server keinen Einfluss hast, kannst du die Geschichte so direkt vergessen.

Direkt würde ich versuchen, CORS auf dem Server richtig zu konfigurieren. Eigentlich gehe ich davon aus, dass wenn JIRA eine REST-API bereitstellt, sie dann auch fähig sein muss, von anderen Domains aus angesprochen zu werden, also CORS können muss. Ajax hat auf alle Fälle die Möglichkeit, Request-Header hinzuzufügen, auch die jQuery-Funktion. Also wenn der Browser den Origin-Header nicht von selbst setzt, kannst du das darüber tun.

Ansonsten müsstest du einen Proxy auf der Domain aufsetzen, von der deine Website abgerufen wird. Das kann ein einfach gehaltenes PHP-Script sein, dass die Aufrufe und deren Antworten durchreicht. Der Proxy hat dann kein Cross-Origin-Problem mit deinem Browser und, weil du ihn selbst schreibst, muss er auch nicht die COP hin zum JIRA beachten.

dedlfix.