API Википедии + запросы с кросс-началом

Я пытаюсь получить доступ к wikipedia, используя javascript + CORS

Насколько я знаю, википедия должна поддерживать CORS: http://www.mediawiki.org/wiki/API:Cross-site_requests

Я попробовал следующий скрипт: создать XMLHttpRequest + credential / XDomainRequest, добавить некоторые Http-заголовки («Access-Control-Allow-Credentials», …) и отправить запрос.

http://jsfiddle.net/lindenb/Vr7RS/

var WikipediaCORS= { setMessage:function(msg) { var span=document.getElementById("id1"); span.appendChild(document.createTextNode(msg)); }, // Create the XHR object. createCORSRequest:function(url) { var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr) { xhr.open("GET", url, true); } else if (typeof XDomainRequest != "undefined") { xhr = new XDomainRequest(); xhr.open(method, url); } else { return null; } xhr.setRequestHeader("Access-Control-Allow-Credentials", "true"); xhr.setRequestHeader("Access-Control-Allow-Origin","*"); return xhr; }, init:function() { var _this=this; var url = 'http://en.wikipedia.org/w/api.php?action=opensearch&search=Javascript&format=json'; var xhr = this.createCORSRequest(url); if (!xhr) { this.setMessage('CORS not supported'); return; } xhr.onload = function() { _this.setMessage(xhr.responseText); }; xhr.onerror = function() { _this.setMessage('Woops, there was an error making the request.'); }; xhr.send(); } }; 

Но мой скрипт терпит неудачу (вызывается «xhr.onerror»). Как я могу это исправить?

Благодарю.

Заголовки CORS отправляются для доступа к запрашивающему скрипту для доступа к содержимому.

Википедия отправляет CORS, а не ВАС.

Со страницы, которую вы указали:

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

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

Это означает, что вам нужно отправить заголовок Origin чтобы сообщить wikipedia, откуда вы пришли. Википедия управляет доступом, а не вы.

Отправить этот заголовок:

 xhr.setRequestHeader("Origin", "http://www.yourpage.com"); 

Заголовки заголовков Access-Control-Allow-* являются заголовками ответов , а не заголовками запросов .

Wikipedia дополнительно требует типа содержимого json:

 xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); 

Я должен был сделать это на проекте freeCodeCamp, и решение было настолько простым, что мне пришлось смеяться, так как я часами искал его. В вашем jquery url включите этот параметр & origin = *

Работающий Codepen

 $.getJSON("https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=15&generator=search&origin=*&gsrsearch=" + q, function(data){ 

На сегодняшний день Wikipedia поддерживает запросы CORS, используя обычные запросы ajax (нет необходимости в обработке JSONP / обратного вызова). Это можно сделать, установив источник в вызове API.

Для аутентифицированных запросов это должно соответствовать точно одному из «истоков» в заголовке Origin (вам нужно установить это с помощью свойства beforeSend при вызове ajax).
Для неавторизованных запросов вы можете просто установить его как звездочку (*), и она работает при использовании простого $ .getJSON из вашего домена. Пример вызова api:
https://en.wikipedia.org//w/api.php?action=opensearch&format=json&origin=*&search=stack&limit=10
Подробнее в изолированной программной среде MediaWiki API: песочница MediaWiki API

Вы можете использовать jQuery JSONP:

 $.ajax( { url: "https://en.wikipedia.org/w/api.php", jsonp: "callback", dataType: 'jsonp', data: { action: "query", list: "search", srsearch: "javascript", format: "json" }, xhrFields: { withCredentials: true }, success: function(response) { ... } } 
  • Холст был испорчен работой по перекрестным данным
  • Понимание AJAX CORS и соображения безопасности
  • Функция AJAX с Mailgun, получая «Поле заголовка запроса ERROR. Авторизация не разрешена с помощью Access-Control-Allow-Headers»
  • Загрузка междоменной конечной точки с помощью jQuery AJAX
  • Как использовать Cors в любом месте для обратного прокси-сервера и добавлять заголовки CORS
  • CORS cookie учетные данные из мобильного WebView загружаются локально с файлом: //
  • Происхождение http: // localhost не разрешено Access-Control-Allow-Origin
  • Canvas.toDataURL () SecurityError
  • Доступ к родительскому URL из iframe
  • Evil Firefox Error - «Параметр или операция не поддерживается базовым объектом»
  • Печенье с перекрестным доменом, использующее CORS в Safari
  • Interesting Posts

    Как иметь скрипт в сценарии добавления <head> add в конце <body>

    Доступ к частным методам JS

    Удалить маршрут с помощью google map

    Вид не загружается, когда я обманываю бэкэнд

    Удалить объекты на разъеме socket.io

    Вставьте обработчик JQuery, который выполняется до того, как они уже зарегистрированы

    Как сделать скриншот сайта на стороне клиента JavaScript / как Google это сделал? (Нет необходимости обращаться к жесткому диску)

    AmCharts, захват события click для выбора периода

    Показать клавиатуру для div с contenteditable = "true" в ios

    График диаграммы Google с датой по оси x

    Обработаны ли обработчики событий в JavaScript?

    Остановить прокси-сервер мобильной сети от ввода JavaScript

    Как проверить «частные» функции в угловом сервисе с кармой и жасмином

    Javascript: Как вызвать возврат внешней функции из внутренней функции?

    Как проверить, нравится ли пользователю моя Facebook-страница или URL-адрес с помощью API Facebook

    Давайте будем гением компьютера.