API:Cross-site requests/ru

Category:MediaWiki action API/ru

If an external site needs to make an API call against a MediaWiki site, it must use CORS (preferred) or JSONP (older, less secure).

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

См. также: Manual: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. This is the way to go, for instance, if a script on the English Wikipedia needs to check image information on Commons. The rest of this section is for developers who cannot use mediawiki.ForeignApi.

API MediaWiki также требует, чтобы исходный сайт был указан как параметр строки запроса, со значением, являющимся сайтом, с которого исходит запрос, который проверяется на соответствие с требуемым протоколом CORS заголовком Origin. If the CORS request is authenticated via cookies, the origin value must be the site from which the request originates, which is matched against the Origin header required by the CORS protocol. Обратите внимание, что этот заголовок должен быть включён в любой 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-запросы, $CrossSiteAJAXdomains должен быть установлен соответствующе, чтобы разрешить исходный сайт. Если проверка источника CORS проходит, MediaWiki включит заголовок Access-Control-Allow-Credentials: true в ответ, чтобы куки аутентификации могли быть посланы.

Authenticated CORS requests using OAuth

Версия MediaWiki:
1.44
Gerrit change 1118583

To make an authenticated CORS request using OAuth, obtain an OAuth access token using the normal authorization flow, then make the request with crossorigin= in the request URL (no value necessary) and Authorization: Bearer access token in the request headers.

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

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

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

Using JSONP weakens the security of your origin site because, as described above, API responses are executed as JavaScript code. If an attacker compromises the remote site, they can use their access to run arbitrary JavaScript code in your users' browsers, within the context of your site. It is recommended to use CORS instead.
Любые запросы 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
 */
window.my_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=my_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

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

Category:MediaWiki action API/ru