API:Požadavky napříč weby

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

Pokud externí web potřebuje provést volání API proti webu MediaWiki, musí použít CORS nebo JSONP.

Použití 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.

MediaWiki API vyžaduje, aby byl origin zadán jako parametr řetězce dotazu, přičemž hodnotou je stránka, ze které požadavek pochází, což je porovnáno s hlavičkou Origin vyžadovanou protokolem CORS. Všimněte si, že tento parametr musí být zahrnut v každém pre-flight požadavku, a proto by měl být zahrnut v části řetězce dotazu v identifikátoru URI požadavku i pro požadavky POST.

Když je zadán parametr origin a požadavek nevrátí úspěšnou odpověď CORS, MediaWiki≥1.30 vrátí hlavičku MediaWiki-CORS-Rejection se stručným důvodem selhání, např. v případě neshodného původu nebo nepodporovaných hlaviček v hlavičce požadavku Access-Control-Request-Headers.

Neověřené požadavky CORS

Neautentizované požadavky CORS mohou být provedeny z libovolného zdroje nastavením parametru požadavku origin na *. V tomto případě MediaWiki zahrne do odpovědi hlavičku Access-Control-Allow-Credentials: false a zpracuje požadavek, jako by byl odhlášen.

Příklad

Požadavek GET
Získejte jména prvních tří obrázků z Wikimedia Commons.

Ukázkový kód
var apiEndpoint = "https://commons.wikimedia.org/w/api.php";
var params = "action=query&list=allimages&ailimit=3&format=json";

/**
 * Odešlete žádost o získání obrázků
 */
fetch(apiEndpoint + "?" + params + "&origin=*")
    .then(function(response){return response.json();})
    .then(function(response) {
          var allimages = response.query.allimages; // Zpracujte výstup, abyste získali názvy obrázků
          Object.keys(allimages).forEach(function(key) {
               console.log(allimages[key].name);
          });
     });

Odpověď

!!!!!_Mdina_Fortifications,_Ditch,_Bridge_and_Main_Gate.jpg
!!!!_Mdina_buildings_!!!!.jpg
!!!!_Palazzo_Dorell_ancillary_building.jpg

Ověřené požadavky CORS

Chcete-li provést ověřený požadavek CORS, musí být nastavení $wgCrossSiteAJAXdomains vzdálené wiki nastaveno tak, aby umožňovalo původní web. Pokud kontrola původu CORS projde, MediaWiki zahrne do odpovědi hlavičku Access-Control-Allow-Credentials: true, takže mohou být odeslány ověřovací soubory cookie.

Manual:CORS obsahuje další pokyny a příklady, jak zpracovat požadavky CORS v JavaScriptu.

Použití JSONP

format=json API přijímá parametr callback, jehož hodnotou je funkce JavaScriptu, do které bude zabalen výsledek JSON. To lze použít k volání rozhraní API na vzdáleném webu dynamickým přidáním značek ‎<script> do dokumentu.

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.
Jakékoli požadavky JSONP budou zpracovány, jako byste byli odhlášeni (tj. jako anonymní uživatel), a to i po přihlášení na vzdálenou wiki.

Příklad

Požadavek GET

Získejte názvy tří náhodných stránek z anglické Wikipedie.

Ukázkový kód

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

/**
 * Funkce pro zabalení výsledku
 */
window.my_callback = function (response) {
    var pages = response.query.random; // Zpracujte výstup, abyste získali tituly
    Object.keys(pages).forEach(function(key) {
        console.log(pages[key].title);
    });
};

var scriptTag = document.createElement("script"); // Dynamicky vytvořte značku "script".
scriptTag.src = apiEndpoint + "?" + params + "&callback=my_callback"; // Ukažte na řetězec dotazu

document.body.appendChild(scriptTag); // Přidejte do dokumentu značku skriptu

Odpověď

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

Související odkazy