Междоменный запрос GET, разница между браузером и локальным хостом, выполняющим вызов

#javascript #jquery #ajax #get #cross-domain

#javascript #jquery ( jquery ) #ajax #получить #междоменный

Вопрос:

Я пытаюсь сделать запрос GET к API из локально размещенного приложения meteor ( => App running at: http://localhost:3000/ ), и при этом я получаю сообщение об ошибке:

«XMLHttpRequest не может загрузить [api-url]. В запрошенном ресурсе отсутствует заголовок ‘Access-Control-Allow-Origin’. http://localhost:3000 Поэтому доступ к Origin запрещен «.

Тем не менее, когда я вставляю [-api-url] в свой браузер и нажимаю ENTER, в окне моего браузера отображается соответствующий ответ API (небольшой объект JSON). Я прочитал несколько других сообщений SO о проблемах с междоменными запросами, но я не понимаю решений или в чем разница между отправкой GET из моего кода или из браузера. Может кто-нибудь объяснить, почему происходит такое поведение, и каковы соответствующие изменения в моем коде / дизайне? Мой существующий код выглядит следующим образом:

 $.ajax({
  type: "get",
  url: auth_ad_act_url,
  data: {
    ads_token: ACCESS_TOKEN
  },
  dataType: 'jsonp',
  success: function(data, status) {
    console.log(data);
  }
});
 

Редактировать:
Я выполняю jQuery.ajax() типа «get», снабженный URL-адресом, объектом параметров и функцией успешного обратного вызова, а также типом данных ‘jsonp’ для обработки междоменных запросов.

Я опубликовал новый код. Теперь ошибка заключается в том, что ответ неверен. (Я знаю это, потому что это работало из моего браузера, и этот ответ соответствовал документации API). Ответ таков: «Ресурс интерпретируется как скрипт, но передается с помощью MIME-типа text / html: https://host.com/apps /[my-app-id]/авторизовать учетную запись пользователя?callbac …» но это должен быть объект с ключом «url» и еще кое-что. Я также получаю ошибку «Uncaught SyntaxError: неожиданный токен:», когда я включаю ‘jsonp’. Но этот неправильный ответ, упомянутый выше, по-прежнему регистрируется на консоли, поэтому я не понимаю, когда и где возникает эта синтаксическая ошибка.

Комментарии:

1. Политика MDN того же происхождения

Ответ №1:

Та же политика происхождения не включает то, что вы вводите в свою адресную строку. Если бы это произошло, вы буквально не смогли бы получить доступ к любому веб-сайту вообще, если он не был сохранен на вашем локальном компьютере!

В вашей ситуации, чтобы получить необходимый вам ресурс из get jQuery, вам нужно либо использовать серверный прокси, размещенный в соответствующем домене, либо, поскольку вы используете JSON, посмотрите, поддерживает ли используемый вами API JSONP.

Ответ №2:

Существует возможность получить данные JSON с междоменным запросом. Вы должны использовать JSONP и определить метод обратного вызова, который должен быть в вызове и в данных JSON.

Ваш запрос:

 $.ajax({
    type: "GET",
    url: auth_ad_act_url   "amp;callback=?",
    jsonpCallback: "jsonCallback",
    dataType: "jsonp",
    success: function(data) {
        // Do something with the data
    }
)};
 

Файл JSON на внешнем сервере:

 jsonCallback(INSERT_HERE_THE_JSON_DATA);
 

Если у вас нет возможности добавить обратный вызов JSON на внешний сервер, проверьте CORS.

Комментарии:

1. Запрашиваемый мной URL-адрес является чужим API, поэтому я ничего не могу сделать с их кодом, например, вставить этот jsonCallback. Что это за прокси-бизнес, упомянутый выше? Я кратко прочитал, что это значит, но я не уверен, что это влечет за собой с точки зрения кода.