API:Межсайтовые запросы
Эта страница является частью документации по API действий MediaWiki. |
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
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.
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-запрос
Пример кода
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>
к документу.
Пример
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