Antworten:
Dies ist eine ziemlich weit gefasste Frage, die ein Wiki für sich rechtfertigen könnte. Es gibt auch einiges auf Google in Bezug auf die beiden, aber ich denke, ich kann ein paar wichtige Punkte treffen.
Wenn beides nicht von Belang ist, würde ich mich einfach für das entscheiden, was Ihnen am einfachsten oder vertrautesten ist. Wenn es ein Fehler ist, versuchen Sie es mit CORS, da es die "modernere" Lösung ist und JSONP eher ein Hack ist, der Daten in Skripte umwandelt, um domänenübergreifende Einschränkungen zu umgehen. CORS erfordert jedoch normalerweise mehr serverseitige Konfiguration.
Wenn Sie jQuery verwenden, bin ich mir nicht sicher, woher Sie die Idee haben, dass CORS " viel benutzerfreundlicher und einfacher zu implementieren ist ". Siehe https://gist.github.com/3131951 . jQuery abstrahiert die Details von JsonP, und es kann je nach verwendeter Technologie schwierig sein, CORS auf Ihrer Serverseite zu implementieren.
Ich habe kürzlich eine Web-App mit jquery und backbone.js entwickelt, die von verschiedenen domänenübergreifenden Webdiensten liest, die wir steuern, und schließlich Json-P anstelle von CORS verwendet, da wir IE7 unterstützen müssen und dies etwas einfacher war auf der Serverseite (wir führen Django mit DjangoRestFramework aus) und praktisch dasselbe mit jquery auf der Clientseite.
Du bist genau richtig. Wenn Sie keine älteren Browser unterstützen müssen (die vor mehr als 6 Jahren veröffentlicht wurden), würde ich mich definitiv für CORS entscheiden.
CORS ist einfacher zu implementieren, da es einfacher ist, nur ein paar statische Header hinzuzufügen, wenn Ihre API JSONP oder CORS noch nicht unterstützt, als den Antwortkörper zu ändern.
Außerdem ist es einfacher, Anforderungen mit CORS zwischenzuspeichern. Jede JSONP-Anforderung muss auch bei zwischengespeicherten Inhalten dynamisch sein.
JSONP ist immer noch ein Skript-Tag, unabhängig davon, was es zu einem gewissen Grad an synchronem Verhalten führt. CORS wird nicht.
JSONP kann nur ein GET sein. Und wie bei CORS können Sie jede Methode anwenden.
Wenn Sie jQuery v1.x verwenden , sollten Sie berücksichtigen, dass error
und complete
(oder besser fail
und always
) Handler in einigen häufigen Situationen (z. B. Netzwerkfehlern) immer noch nicht für JSONP-Anforderungen aufgerufen werden. Sicher, es gibt Problemumgehungen (Timeout-Einstellung, jQuery-JSONP-Plugin), aber ich finde CORS weniger ärgerlich, insbesondere wenn domänenübergreifende Anfragen nur von mobilen Geräten (dh Hybrid-Apps) kommen, sodass Sie keine Unterstützung für unglückliche Browser benötigen.
Laut Spring Documentation ist JSONP ein Hack und keine richtige Lösung für die gemeinsame Nutzung von Cross Origin-Ressourcen. Wenn die Sicherheit nicht Ihr Anliegen ist, überprüfen Sie einfach Ihren Domänenursprung auf Ihrem Server und fügen Sie den Header Access-Control-Allow-Origin Response hinzu.
Unsere Web-API funktionierte unter Safari (iOS 9.1) mit Windows-Authentifizierung nicht. Es funktionierte mit Safari + iOS 8.4. Als wir zu JSONP wechselten, begann Safari wieder zu arbeiten. Überprüfen Sie diesen Link für weitere Informationen.