J'essaie de faire une demande GET sur l'API wikipedia. L'utilisation de jQuery comme ci-dessous fonctionne bien:
$.ajax({
url: 'https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=10&prop=pageimages|extracts&pilimit=max&exintro&explaintext&exsentences=1&exlimit=max&gsrsearch=Test&callback=JSON_CALLBACK',
type: 'GET',
headers: {'X-Requested-With': 'XMLHttpRequest'},
crossDomain: true,
dataType: 'jsonp'
}).done(function(data) {
console.log("Data: ", data);
});
Mais je veux utiliser fetch ou axios api, qui s'arrête à pré-vol avec la méthode de demande: OPTIONS . Pourquoi cela fonctionne-t-il dans jQuery mais pas dans les autres API?
axios.get('https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=10&prop=pageimages|extracts&pilimit=max&exintro&explaintext&exsentences=1&exlimit=max&gsrsearch=Test&callback=JSON_CALLBACK',
{ headers: {'X-Requested-With': 'XMLHttpRequest',
'content-type': 'text/plain'}
})
.then(function (response) {
console.log("Response: ", response);
});
J'ai vu que cela pouvait être lié au Content-Type de la requête GET, sur jQuery, la valeur par défaut semble être text/plain, mais je n'ai pas réussi en essayant de modifier le type de contenu des requêtes fetch/axios envoyées sous la forme text/html.
Avez-vous des réflexions sur ce qui pourrait être le problème?
J'ai trouvé que le problème n'était pas lié au type de contenu des demandes.
Le problème était dû au fait que les API (fetch et axios) ne prennent pas en charge les requêtes jsonp . L'utilisation de jsonp n'était pas assez claire pour moi, j'ai pu trouver une bonne explication ici: http://stackoverflow.com/a/6879276/4051961
Bien qu'ils ne le prennent pas en charge, ils proposent des alternatives pour effectuer jsonp les requêtes:
axios: https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp
chercher: https://www.npmjs.com/package/fetch-jsonp
Le moyen recommandé d'accéder à JSONP avec axios est en fait de ne pas utiliser axios:
En bref:
npm install jsonp --save
utilisez-le comme:
var jsonp = require('jsonp');
jsonp('http://www.example.com/foo', null, function (err, data) {
if (err) {
console.error(err.message);
} else {
console.log(data);
}
});
Ran dans le problème dans une React Application
Axios ne prend pas en charge JSONP, il propose des alternatives pour effectuer les requêtes jsonp:
Suivez ce lien pour voir la documentation de jsonp pour axios: axios: https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp
Voici ma documentation:
Étape 1: $ npm install jsonp --save
Étape 2:
import jsonp from 'jsonp';
(cela va en haut de votre composant)
Étape 3: Créez une méthode dans votre composant React:
JSONP () {
jsonp( "https://*YourUrlHere.jsonp", { name: 'Name Of JSONP Callback Function' }, (error, data) => {
if (error) {
this.setState({
error,
});
} else {
this.setState({
data: data,
});
}
});
}