API:Cross-site requests/cs
![]() | Tato stránka je součástí dokumentace k API Action MediaWiki. |
Pokud externí web potřebuje provést volání API proti webu MediaWiki, musí použít CORS (preferováno) nebo JSONP (starší, méně bezpečné) .
Použití CORS
Pokud je uživatelský skript nebo gadget použit k volání API proti webu v rámci stejné wiki rodiny , musí používat modul MediaWiki, který používá CORS pod kapotou: mediawiki.ForeignApi
.
To je způsob, jak postupovat například, pokud skript na anglické Wikipedii potřebuje zkontrolovat informace o obrázku na Commons.
Zbytek této části je pro vývojáře, kteří nemohou používat mediawiki.ForeignApi
.
MediaWiki API vyžaduje, aby byl jako parametr řetězce dotazu zadán origin
nebo crossorigin
.
Pokud je požadavek CORS autentizován pomocí souborů cookie, hodnota origin
musí být 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
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 pomocí souborů cookie
Chcete-li provést ověřený požadavek CORS pomocí souborů cookie, musí být nastavení $wgCrossSiteAJAXdomains
vzdálené wiki nastaveno tak, aby umožňovalo zdrojový web, a parametr origin
musí být nastaven na zdrojový web v URL požadavku.
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.
Ověřené požadavky CORS pomocí OAuth
Verze MediaWiki: | 1.44 Gerrit change 1118583 |
Chcete-li odeslat ověřený požadavek CORS pomocí OAuth , získejte přístupový token OAuth pomocí normálního autorizačního postupu, poté proveďte požadavek s crossorigin=
v URL požadavku (není nutná žádná hodnota) a Authorization: Bearer přístupový token
v záhlaví požadavku.
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.
Příklad
Požadavek GET
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