API Википедии + запросы с кросс-началом
Я пытаюсь получить доступ к wikipedia, используя javascript + CORS
Насколько я знаю, википедия должна поддерживать CORS: http://www.mediawiki.org/wiki/API:Cross-site_requests
Я попробовал следующий скрипт: создать XMLHttpRequest + credential / XDomainRequest, добавить некоторые Http-заголовки («Access-Control-Allow-Credentials», …) и отправить запрос.
- XmlHttpRequest CORS POST отправлен без файлов cookie
- Совместное использование ресурсов для Tomcat 5.5
- MediaElementAudioSource выводит нули из-за ограничений доступа CORS к локальному mp3-файлу
- Перекрестный домен AJAX предполетная проверка сбоя Проверка происхождения
- CORS не работает в Chrome
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 - http OPTIONS с помощью функции «Угловая» и «Экспресс»
- Последствия безопасности для добавления всех доменов в CORS (Access-Control-Allow-Origin: *)
- XMLHttpRequest: ошибка сети 0x80070005, доступ запрещен на Microsoft Edge (но не в IE)
- Получение запроса на запрос Cross Origin при использовании .getJSON для получения сведений о приложении Play Store
- Пожалуйста, помогите проверить проблему CORS в Firefox jQuery ajax, когда 401
- Как правильно настроить nginx Access-Control-Allow-Origin в заголовок ответа на основе заголовка Origin из запроса?
- Нажатие данных в таблицу Google с помощью JavaScript, запущенного в браузере
- IE10 и совместное использование ресурсов (CORS) с изображением / холстом
Заголовки 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) { ... } }