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

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page API:Cross-site requests and the translation is 44% complete.

Outdated translations are marked like this.
Other languages:
Deutsch • ‎English • ‎dansk • ‎español • ‎français • ‎română • ‎русский • ‎ไทย • ‎中文 • ‎日本語 • ‎한국어

Если пользовательскому скрипту или гаджету нужно сделать вызов API другого сайта на движке MediaWiki (например, скрипту на русской Википедии нужно проверить информацию изображения на Викискладе), необходимо использовать JSONP или CORS.

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

API format=json принимает параметр «callback», который указывает название функции JavaScript, в которую будет обёрнут результат JSON.

Это может быть использовано, чтобы вызвать API на другом сайте, динамически добавляя теги <script> к документу.

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

Пример

GET-запрос

Get the titles of three random pages from English Wikipedia.

Пример кода

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

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

API MediaWiki также требует, чтобы исходный сайт был указан как параметр строки запроса, называющийся origin, который проверяется на соответствие с требуемым протоколом CORS заголовком Origin.

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

Если указан параметр запроса «origin», MediaWiki (с версии 1.30) вернёт заголовок MediaWiki-CORS-Rejection с кратким описанием причины ошибки, если запрос не приводит к успешному CORS-ответу, например в случае несовпадения источников или неподдерживаемых заголовков в заголовке запроса Access-Control-Request-Headers.

Unauthenticated CORS Requests

Неаутентифицируемые CORS-запросы могут быть посланы с любого источника, если параметр «origin» запроса задать как равный «*». В этом случае MediaWiki включит в ответ заголовок Access-Control-Allow-Credentials: false и обработает запрос как посланный не зашедшим в учётную запись пользователем (на случай если входные данные каким-то образом всё равно были отправлены).

Пример

GET-запрос

Get the names of the first three images from Wikimedia Commons.

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

/**
 * Send the request to get the images
 */
fetch(apiEndpoint + "?" + params + "&origin=*")
    .then(function(response){return response.json();})
    .then(function(response) {
          var allimages = response.query.allimages; // Process the output to get the image names
          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

Authenticated CORS Requests

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

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

Additional notes

  • Detailed differences between JSONP and CORS are available at CORS vs JSONP.

См. также