API:Requêtes entre différents sites

This page is a translated version of the page API:Cross-site requests and the translation is 79% complete.
Outdated translations are marked like this.

If an external site needs to make an API call against a MediaWiki site, it must use CORS (preferred) or JSONP (older, less secure).

Utilisation de CORS

If a user script or gadget is used to make an API call against a site within the same wiki family , it must use a MediaWiki module that uses CORS under the hood: mediawiki.ForeignApi . This is the way to go for instance, if a script on the English Wikipedia needs to check image information on Commons.

L'API MediaWiki demande que origin soit fourni comme paramètre de requête, dont la valeur est le nom du site qui émet la requête, et qui est comparée avec l'entête Origin nécessaire au protocole CORS. Remarquez que ce paramètre doit être inclus dans chaque requête préparatoire et devrait donc être inclus dans la partie de chaîne de demande de la requête URI, même pour une requête de type POST.

Quand le paramètre origin est fourni et que la requête ne renvoie pas de réponse CORS positive, MediaWiki (depuis la 1.30) renvoie un entête MediaWiki-CORS-Rejection avec un bref motif d'échec, par exemple si l'origine ne correspond pas ou si un entête de la requête Access-Control-Request-Headers n'est pas supporté.

Requêtes CORS non authentifiées

Les requêtes CORS non authentifiées peuvent être faites à partir d'une origine quelconque en positionnant le paramètre de requête origin à *. In this case MediaWiki will include the Access-Control-Allow-Credentials: false header in the response and will process the request as if logged out.

Exemple

Requête GET
Récupérer les noms des trois premières images de Wikimedia Commons.

Exemple de code
var apiEndpoint = "https://commons.wikimedia.org/w/api.php";
var params = "action=query&list=allimages&ailimit=3&format=json";

/**
 * envoyer la requête pour obtenir les images
 */
fetch(apiEndpoint + "?" + params + "&origin=*")
    .then(function(response){return response.json();})
    .then(function(response) {
          var allimages = response.query.allimages; // traiter la sortie pour obtenir le nom des images
          Object.keys(allimages).forEach(function(key) {
               console.log(allimages[key].name);
          });
     });

Réponse
!!!!!_Mdina_Fortifications,_Ditch,_Bridge_and_Main_Gate.jpg
!!!!_Mdina_buildings_!!!!.jpg
!!!!_Palazzo_Dorell_ancillary_building.jpg

Requêtes CORS authentifiées

Pour faire une requête CORS authentifiée, l'option $wgCrossSiteAJAXdomains du wiki distant doit être renseignée de façon à ce que le site source soit accepté. Si la source du CORS est acceptée, MediaWiki inclura l'entête Access-Control-Allow-Credentials: true dans la réponse, de manière à ce que le cookie d'authentification puisse être envoyé.

Manuel:CORS/fr contient plus d'informations et d'exemples sur la manière de manipuler les requêtes CORS en JavaScript.

Utilisation de JSONP

L'API format=json accepte un paramètre callback dont la valeur est une fonction JavaScript dans laquelle la sortie JSON sera empaquetée. Ceci peut-être utilisé pour appeler l'API sur un site distant en ajoutant des balises ‎<script> dynamiquement au document.

Using JSONP weakens the security of your origin site because, as described above, API responses are executed as JavaScript code. If an attacker compromises the remote site, they can use their access to run arbitrary JavaScript code in your users' browsers, within the context of your site. It is recommended to use CORS instead.
Toute requête JSONP est traitée hors connexion (c'est à dire comme si on était un utilisateur anonyme), même si l'on est connecté dans le wiki distant.

Exemple

Requête GET

récupérer les titres de trois pages au hasard de la Wikipedia anglophone.

Exemple de code

var apiEndpoint = "https://en.wikipedia.org/w/api.php";
var params = "action=query&list=random&rnlimit=3&format=json";

/**
 * la fonction pour envelopper le résultat
 */
window.my_callback = function (response) {
    var pages = response.query.random; // traiter la sortie pour récupérer les titres
    Object.keys(pages).forEach(function(key) {
        console.log(pages[key].title);
    });
};

var scriptTag = document.createElement("script"); // créer dynamiquement une balise "script"
scriptTag.src = apiEndpoint + "?" + params + "&callback=my_callback"; // chaîne de la requête

document.body.appendChild(scriptTag); // ajouter la balise 'script' au document

Réponse

Kache Aye Shoi
Talk:Sarbka, Wągrowiec County
Category:Nakhon Ratchasima Province

Voir aussi