API:Peticiones en sitios cruzados

This page is a translated version of the page API:Cross-site requests and the translation is 100% complete.

Si un script de usuario o un accesorio necesita hacer una llamada de la API contra otro sitio de MediaWiki (por ejemplo, un script en Wikipedia en español tiene que comprobar información de imágenes de Commons), tiene que usar JSONP o CORS.

Uso de JSONP

El API $Json acepta un parámetro de callback, cuyo valor es una función de JavaScript en la que el JSON resultado será incluido . Esto se puede usar para llamar a la API en un sitio remoto añadiendo etiquetas ‎<script> al documento.

Cualquier petición JSONP será procesada como si hubiera cerrado sesión (es decir, como un usuario anónimo), incluso después de iniciar sesión en la wiki remota.

Ejemplo

CONSIGUE petición

Conseguir los títulos de tres páginas aleatorias de Wikipedia inglesa.


Código de muestra

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

/**
 * La función para envolver el resultado
 */
var callback = function (response) {
    var pages = response.query.random; // Procesar la producción para conseguir los títulos.
    Object.keys(pages).forEach(function(key) {
        console.log(pages[key].title);
    });
};

var scriptTag = document.createElement("script"); // Crear dinámicamente una etiqueta "script"
scriptTag.src = apiEndpoint + "?" + params + "&callback=callback"; // Señalar la cadena de consulta

document.body.appendChild(scriptTag); // Agregar la etiqueta de script al documento

Respuesta

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

Uso de CORS

El API de MediaWiki requiere que el origen sea suministrado como parámetro de cadena de consulta, siendo el valor el sitio desde el que se origina la solicitud, que coincide con el encabezado Origen requerido por el protocolo CORS. Ten en cuenta que el parámetro debe incluirse en cualquier petición de preverificación, y por tanto debe incluirse en la parte de la cadena de consulta de la URI de la petición, incluso para peticiones POST.

Cuando el parámetro origin es proporcionado y la petición no devuelve una respuesta CORS exitosa, MediaWiki≥1.30 devolverá un $encabezado de rechazo con una breve razón del error, p. Ej. en caso de origen no coincidente o encabezados no compatibles en un encabezado de petición Access-Control-Request-Headers.

Peticiones CORS no autentificadas

Las peticiones CORS no autenticadas pueden ser realizadas desde cualquier origen estableciendo el parámetro de petición origin en *. En este caso, MediaWiki incluirá el encabezamiento Access-Control-Allow-Credentials: false en la respuesta y procesará la petición como si hubiera cerrado la sesión.

Ejemplo

CONSIGUE petición

Conseguir los nombres de las primeras tres imágenes de Wikimedia Commons.


Código de muestra
var apiEndpoint = "https://commons.wikimedia.org/w/api.php";
var params = "action=query&list=allimages&ailimit=3&format=json";

/**
 * Enviar la petición para conseguir las imágenes
 */
fetch(apiEndpoint + "?" + params + "&origin=*")
    .then(function(response){return response.json();})
    .then(function(response) {
          var allimages = response.query.allimages; // Procesar la salida para conseguir los nombres de imagen
          Object.keys(allimages).forEach(function(key) {
               console.log(allimages[key].name);
          });
     });
Respuesta
!!!!!_Mdina_Fortifications,_Ditch,_Bridge_and_Main_Gate.jpg
!!!!_Mdina_buildings_!!!!.jpg
!!!!_Palazzo_Dorell_ancillary_building.jpg

Peticiones CORS autenticadas

Para hacer una petición CORS autentificada, la variable $wgCrossSiteAJAXdomains del wiki remoto debe estar configurada de tal forma que admita el sitio de origen. Si el origen del CORS es aceptado, MediaWiki incluirá la cabecera Access-Control-Allow-Credentials: true en la respuesta para que se puedan enviar cookies de autentificación.

Véase Manual:CORS para las instrucciones para manejar peticiones CORS en JavaScript.

Notas adicionales

  • Las diferencias detalladas entre JSONP y CORS están disponibles en CORS vs JSONP.

Véase también