API:Požadavky napříč weby
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
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
.
To je způsob, jak postupovat například, pokud skript na anglické Wikipedii potřebuje zkontrolovat informace o obrázku na Commons.
MediaWiki API vyžaduje, aby byl origin
zadán jako parametr řetězce dotazu. Pokud je požadavek CORS autentizován, jeho hodnota musí být místo, ze kterého 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
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.
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