API:Межсайтовые запросы

From mediawiki.org
This page is a translated version of the page API:Cross-site requests and the translation is 73% 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 or JSONP.

User scripts and gadgets within the same wiki-family (e.g. a script on the English Wikipedia needs to check image information on Commons) should use mediawiki.ForeignApi , which uses CORS under the hood.

Использование CORS

API MediaWiki также требует, чтобы исходный сайт был указан как параметр строки запроса, со значением, являющимся сайтом, с которого исходит запрос, который проверяется на соответствие с требуемым протоколом CORS заголовком Origin. Обратите внимание, что этот заголовок должен быть включён в любой pre-flight запрос, и таким образом должен быть включён в часть строки запроса запрашиваемого URI даже для POST запросов.

Если указан параметр origin и запрос не возвращает успешный ответ CORS, MediaWiki≥1.30 вернет заголовок $rejection с краткой причиной сбоя, например в случае несовпадения источников или неподдерживаемых заголовков в заголовке запроса $reqheaders.

Неаутентифицируемые CORS-запросы

Неаутентифицируемые CORS-запросы могут быть посланы с любого источника, если параметр origin запроса задать как равный *. В этом случае MediaWiki включит в ответ заголовок $code2 и обработает запрос как посланный не зашедшим в учётную запись пользователем. 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.

Пример

GET-запрос

Получить названия первых трех изображений из Wikimedia Commons.


Пример кода
var apiEndpoint = "https://commons.wikimedia.org/w/api.php";
var params = "action=query&list=allimages&ailimit=3&format=json";

/**
 * Отправить запрос на получение изображений
 */
fetch(apiEndpoint + "?" + params + "&origin=*")
    .then(function(response){return response.json();})
    .then(function(response) {
          var allimages = response.query.allimages; // Обработать запрос для получения названий изображений
          Object.keys(allimages).forEach(function(key) {
               console.log(allimages[key].name);
          });
     });

Ответ
!!!!!_Mdina_Fortifications,_Ditch,_Bridge_and_Main_Gate.jpg
!!!!_Mdina_buildings_!!!!.jpg
!!!!_Palazzo_Dorell_ancillary_building.jpg

Аутентифицируемые CORS-запросы

Чтобы другая вики разрешала CORS-запросы, $wgCrossSiteAJAXdomains должен быть установлен соответствующе, чтобы разрешить исходный сайт. Если проверка источника CORS проходит, MediaWiki включит заголовок Access-Control-Allow-Credentials: true в ответ, чтобы куки аутентификации могли быть посланы.

Manual:CORS содержит больше инструкций и примеров о том, как обрабатывать CORS-запросы через JavaScript.

Использование JSONP

API format=json принимает параметр callback, значение которого является функцией JavaScript, в которую будет обёрнут результат JSON. Это может быть использовано, чтобы вызвать API на другом сайте, динамически добавляя теги ‎<script> к документу.

Любые запросы JSONP будут обработаны, как если бы вход в учётную запись произведён не был (то есть как анонимный пользователь), даже после входа в удаленную вики.

Пример

GET-запрос

Получить заголовки трех случайных страниц Википедии на английском языке.


Пример кода

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

/**
 * The function to wrap the result
 */
var callback = function (response) {
    var pages = response.query.random; // Process the output to get the titles
    Object.keys(pages).forEach(function(key) {
        console.log(pages[key].title);
    });
};

var scriptTag = document.createElement("script"); // Dynamically create a "script" tag
scriptTag.src = apiEndpoint + "?" + params + "&callback=callback"; // Point to the query string

document.body.appendChild(scriptTag); // Add the script tag to the document

Ответ

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

Дополнительная информация

  • Подробно разница между JSONP и CORS рассматривается в CORS vs JSONP.

Смотрите также