Comment utiliser dataType: ‘jsonp’ mais que application / json existe toujours dans l’en-tête Accept?

Je souhaite accéder à un service REST sur un autre domaine. Si, dans JQuery, je spécifie:

dataType: 'json' 

il échoue, comme prévu, car pour les appels inter-domaines, JSONP doit être utilisé à la place.

Quand je change ceci en:

 dataType: 'jsonp' 

il est prévu qu’il fonctionne, mais échoue car le serveur attend application/json ou application/xml ou text/html , etc., mais pas */* , envoyés par la requête JSONP.

Existe-t-il un moyen de forcer JQuery à mettre application/json dans l’en-tête de la requête Accept lorsqu’il effectue une requête JSON?

AFAIK L’implémentation de JSONP par jQuery utilise une injectée dans le DOM (donc la ressortingction au verbe GET uniquement) pour laquelle vous ne pouvez pas contrôler l'en-tête de type de contenu de demande Accept . Le src de cette balise de script est simplement dirigé vers l'URL du domaine distant. C'est le navigateur qui récupère simplement le sharepoint terminaison sous-jacent en envoyant une requête GET régulière.

Donc, si vous voulez pouvoir définir les en-têtes de requête pour les appels entre domaines, vous devrez configurer un script côté serveur sur votre domaine qui déléguera l'appel au domaine distant (et définir les en-têtes respectifs), puis envoyer la requête AJAX à votre script.

Je pense que vous voudrez essayer quelque chose dans ce sens:

 $.ajax({ headers: { Accept : "application/json; charset=utf-8", "Content-Type": "text/plain; charset=utf-8" } dataType: 'jsonp', success : function(response) { ... } }) 

Cela peut ne pas convenir à votre cas d’utilisation, mais lorsque je dois utiliser AJAX interdomaine, j’ajoute généralement une ressource supplémentaire dans mon domaine, qui appelle ensuite la ressource externe (via cURL ou autre) et renvoie la valeur. au client appelant. En substance, vous construisez un proxy pour l’appel AJAX. C’est certainement plus de temps système, mais vous pourrez peut-être atténuer cela en ajoutant une couche de mise en cache pour de tels appels.