API:Požadavky napříč weby
Akce API MediaWiki |
---|
Základní informace |
Přihlášení |
Uživatelské účty a uživatelé |
Operace spojené se stránkou |
|
Vyhledávání |
Nástroje pro vývojáře |
Návody |
v · d · u |
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 háčkem: 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 JavaScriptu
varapiEndpoint="https://commons.wikimedia.org/w/api.php"; varparams="action=query&list=allimages&ailimit=3&format=json"; /** * Odešlete žádost o získání obrázků */ fetch(apiEndpoint+"?"+params+"&origin=*") .then(function(response){returnresponse.json();}) .then(function(response){ varallimages=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
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.
Příručka: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 JavaScriptu
varapiEndpoint="https://en.wikipedia.org/w/api.php"; varparams="action=query&list=random&rnlimit=3&format=json"; /** * Funkce pro zabalení výsledku */ window.my_callback=function(response){ varpages=response.query.random;// Zpracujte výstup, abyste získali tituly Object.keys(pages).forEach(function(key){ console.log(pages[key].title); }); }; varscriptTag=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ěď
KacheAyeShoi Talk:Sarbka,WągrowiecCounty Category:NakhonRatchasimaProvince