XMLHttpRequest не может загрузить URL с помощью jQuery - PullRequest
55 голосов
/ 30 сентября 2010

Я пытаюсь получить некоторые данные JSON с "удаленного" сайта.Затем я запускаю свой веб-сервис на порту 99000 и запускаю свой веб-сайт на порту 99001 (http://localhost:99001/index.html).

. Я получаю следующее сообщение:

    XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons. Origin http://localhost:99001 is not allowed by Access-Control-Allow-Origin.

Даже если я запускаю свою веб-страницу какHTML-файл, я получаю это:

    XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons.Origin null is not allowed by Access-Control-Allow-Origin.

Веб-служба возвращает данные. Я пытаюсь перехватить элементы данных, как это:

var url = "http://localhost:99000/Services.svc/ReturnPersons";
$.getJSON(url, function (data) {
success: readData(data)
});
function readData(data) {
    alert(data[0].FirstName);
}

И я пытаюсь получить эту структуру:

[{"FirstName":"Foo","LastName":"Bar"},{"Hello":"Foo","LastName":"World"}]

Знаете ли вы, почему я получаю эту ошибку?

Ответы [ 5 ]

39 голосов
/ 30 сентября 2010

Вы не можете сделать кросс-домен XMLHttpRequest, единственным «вариантом» будет метод под названием JSONP, который сводится к следующему:

Для запуска запроса: добавьте новый тег <script> с удаленным URL-адресом, а затем убедитесь, что удаленный URL-адрес возвращает действительный файл JavaScript, который вызывает функцию обратного вызова. Некоторые сервисы поддерживают это (и позволяют назвать ваш обратный вызов в параметрах GET).

Другой простой выход - создать «прокси» на локальном сервере, который получает удаленный запрос, а затем просто «перенаправляет» его обратно в ваш javascript.

изменение / дополнение:

Я вижу, что jQuery имеет встроенную поддержку JSONP, проверяя, содержит ли URL "callback =?" (где jQuery заменит? фактическим методом обратного вызова). Но вам все равно нужно обработать это на удаленном сервере, чтобы сгенерировать правильный ответ.

34 голосов
/ 10 февраля 2011

В новой версии jQuery 1.5 вы можете использовать:

$.ajax({
    type: "GET",
    url: "http://localhost:99000/Services.svc/ReturnPersons",
    dataType: "jsonp",
    success: readData(data),
    error: function (xhr, ajaxOptions, thrownError) {
      alert(xhr.status);
      alert(thrownError);
    }
})
19 голосов
/ 01 апреля 2013

Скрипка с 3 рабочими растворами в действии.

С учетом внешнего JSON:

myurl = 'http://wikidata.org/w/api.php?action=wbgetentities&sites=frwiki&titles=France&languages=zh-hans|zh-hant|fr&props=sitelinks|labels|aliases|descriptions&format=json'

Решение 1: $ .ajax () + jsonp:

$.ajax({
  dataType: "jsonp",
  url: myurl ,
  }).done(function ( data ) {
  // do my stuff
});

Решение 2: $ .ajax () + json + & calback =?:

$.ajax({
  dataType: "json",
  url: myurl + '&callback=?',
  }).done(function ( data ) {
  // do my stuff
});

Решение 3: $ .getJSON () + calback =?:

$.getJSON( myurl + '&callback=?', function(data) {
  // do my stuff
});

Документация: http://api.jquery.com/jQuery.ajax/, http://api.jquery.com/jQuery.getJSON/

6 голосов
/ 04 февраля 2014

Найден возможный обходной путь, о котором я не думаю, что был упомянут.

Вот хорошее описание проблемы: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

В основном, если вы используете формы / url-у вас все в порядке с зашифрованным / простым текстом.

$.ajax({
    type: "POST",
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'text/plain'
    },
    dataType: "json",
    url: "http://localhost/endpoint",
    data: JSON.stringify({'DataToPost': 123}),
    success: function (data) {
        alert(JSON.stringify(data));
    }
});     

Я использую его с ASP.NET WebAPI2.Итак, на другом конце:

public static void RegisterWebApi(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();

    config.Formatters.Clear();
    config.Formatters.Add(new JsonMediaTypeFormatter());

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}

Таким образом, форматер Json используется при разборе простого типа содержимого текста.

И не забудьте в Web.config:

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST" />
  </customHeaders>
</httpProtocol>    

Надеюсь, это поможет.

0 голосов
/ 23 ноября 2016

Я использую WebAPI 3 и столкнулся с той же проблемой.Проблема решена, когда @Rytis добавил свое решение.И я думаю, что в WebAPI 3 нам не нужно определять метод RegisterWebApi.

Мое изменение было только в файле web.config и работает.

<httpProtocol>
 <customHeaders>
 <add name="Access-Control-Allow-Origin" value="*" />
 <add name="Access-Control-Allow-Methods" value="GET, POST" />
</customHeaders>
</httpProtocol> 

Спасибо за васрешение @Rytis!

...