Ошибка CORS в API Википедии (ru.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow) [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

14
задан Pierre 30 May 2014 в 11:14
поделиться

4 ответа

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

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

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

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

Если проверка происхождения CORS проходит, MediaWiki будет включать в ответном ответе: «Ответ на запрос прав доступа: истинный заголовок», поэтому могут быть отправлены файлы cookie аутентификации.

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

Отправить этот исходный заголовок:

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

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

Википедии дополнительно требуется тип содержимого json:

xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
6
ответ дан DanFromGermany 19 August 2018 в 06:00
поделиться
  • 1
    Спасибо за ваш ответ. Я обновил свой скрипт jsfiddle.net/lindenb/Vr7RS/2 и установил два заголовка: это все еще не работает. – Pierre 30 May 2014 в 11:43
  • 2
    @Pierre, вы получили его на работу? Я пробовал, но не сделал: S – DanFromGermany 30 May 2014 в 12:19
  • 3
    Нет, это не так, но, насколько я понимаю, комментарий Ронни Скансинга, en.wikipedia.org, похоже, не позволяет CORS. – Pierre 30 May 2014 в 13:39
  • 4
    Примечание выше: «должно быть включено в часть строки запроса в URI запроса». Таким образом, вы не можете установить заголовок, вы должны добавить '& amp; origin = * к фактическому URL-адресу. – Finnjon 4 October 2016 в 09:02
  • 5
    Просто потратил пару дней на использование конфигурации Apache CORS, не понимая этого. Огромное спасибо! – Sergio 11 November 2016 в 12:05

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

12
ответ дан Adeel Siddiqui 19 August 2018 в 06:00
поделиться
  • 1
    Ваш пример работает также без параметра origin lol – DanFromGermany 11 November 2016 в 12:11
  • 2
    Пример работает только с нуля, если вы делаете это в браузере, а не при использовании AJAX. – BishopZ 27 January 2018 в 00:13

Вы можете использовать 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) { ... }
}
5
ответ дан Aleksandr 19 August 2018 в 06:00
поделиться

У меня была такая же проблема, работая над проектом freeCodeCamp, и решение было настолько простым, что я смеялся, так как я часами искал его. в вашем jquery url включите параметр ниже.

& amp; origin = *

working Codepen

$.getJSON("https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=15&generator=search&origin=*&gsrsearch=" + q, function(data){
62
ответ дан Ashton Morgan 19 August 2018 в 06:00
поделиться
  • 1
    Привет, спасибо! Я работаю над тем же проектом и был в рассоле в отношении CORS с API Wiki. По какой-то причине, когда я прочитал это: «API MediaWiki также требует, чтобы источник был предоставлен в качестве параметра запроса», Я не понимал, что просто должен был сделать, как вы указали. Кажется, это странно, но поскольку сайт, на котором размещены запрашиваемые файлы, обычно устанавливает заголовок allow? Например: Access-Control-Allow-Origin: & lt; origin & gt; | * – Edson 26 September 2016 в 19:40
  • 2
    Кроме того, не могли бы вы разместить ссылку на то, где вы нашли это решение? – Edson 26 September 2016 в 19:43
  • 3
    СПАСИБО! Я вытаскиваю волосы. Я смог использовать API вчера, и сегодня я все время получаю проблему с перекрестным происхождением. Добавив это, мой запрос снова работал. – Bullyen 30 November 2016 в 18:49
  • 4
    XMLHttpRequest не может загрузить ru.wikipedia.org/w/api.php?action=opensearch&origin = * & amp; format = json & amp; search = xxx. Ответ на запрос перед полетом не проходит проверку контроля доступа. Нет заголовка «Access-Control-Allow-Origin» на запрошенном ресурсе. Origin ' localhost: 2222 & # 39 ; поэтому не допускается доступ. – novaline 19 July 2017 в 02:09
  • 5
    Спасибо, на самом деле я также делаю вызов ГЦК – Eleazar Resendez 20 August 2017 в 13:27
Другие вопросы по тегам:

Похожие вопросы: