Сообщение jquery ajax говорит, что xxx не разрешен Access-Control-Allow-Origin

Я пытался вызвать API eBay FindProducts с помощью AJAX (post запрос) но застрял при следующей ошибке:

XMLHttpRequest cannot load http://open.api.ebay.com/shopping?callname=FindProducts. Origin http://localhost.com/test.php is not allowed by Access-Control-Allow-Origin.

Мой код:

$.ajax
({
    type: "POST",
    url: 'http://open.api.ebay.com/shopping?callname=FindProducts',
    dataType: ($.browser.msie) ? "text" : "xml",
    contentType: 'application/x-javascript',
    crossDomain : true,
    data: {
        'X-EBAY-API-APP-ID' : 'ebayAppId', 
        'X-EBAY-API-VERSION': '771', 
        'X-EBAY-API-SITEID': '0', 
        'X-EBAY-API-REQUEST-ENCODING': 'NV', 
        'X-EBAY-API-RESPONSE-ENCODING': 'json',
        'QueryKeywords' : '753759971632',
        'MaxEntries' : '3'
    },
    success: function (result) {
        alert('success');
        alert(result);
    },
    error: function (data) {
        alert((data));
    }
})

Как я могу пройти через эту ошибку.

Я пробовал настройкуdataType : jsonp (Я знаю, что XML извлекается, но для обхода ошибки я установил его в jsonP). Это работает, но jQuery не смог проанализировать XML, поскольку ожидался ответ json.

 Kevin B21 мая 2012 г., 23:36
ешение @ albin решит эту проблему, однако хотите ли вы, чтобы ваш appid был открыт для публики?
 Eswar Rajesh Pinapala21 мая 2012 г., 23:51
appid публичность - это нормально, но я не знаю, почему jquery не смог разобрать ответ, а ajax возвращает ошибку!
 lbstr21 мая 2012 г., 23:35
Возможно, вам придется сделать это на стороне сервера. Вы должны сделать Ajax-вызов на свой сервер, передав любую информацию со страницы, которая вам нужна. Затем нажмите api в php, используя что-то вроде curl.
 Joseph21 мая 2012 г., 23:29
"Я пытался установить dataType: jsonP" - это не сработает, потому что JSONP этон XML и наоборот. попробуйте проверить, поддерживает ли ebay CORS чтобы ты мог читать XML.
 Eswar Rajesh Pinapala21 мая 2012 г., 23:35
Привет, Джозеф, спасибо за ответ. Я понимаю, что json не является xml и наоборот (см. Мой пост в () после того, как я попытался установить dataType: jsonP). Если eBay не поддерживает CORS, есть ли способ сделать это? Есть ли способ получить XML даже после установки для dataType jsonp или сценария (из консоли браузера я вижу, что XML-файл получен, но jquery не смог его проанализировать)? lbstr - спасибо за ваш ответ, я знаю способ заставить это использовать curl / php :). я хочу проверить, можно ли это сделать на стороне клиента.

Ответы на вопрос(3)

Решение Вопроса

&responseencoding=JSON на ваш URL вы получите ответ в формате JSON в соответствии с @ Докумен

ОБНОВИТ Рабочий пример. Что я сделал, так это то, что я изменил наdataType:'jsonp' добавилjsonp:'callbackname'. Потому что jQuery по умолчанию вызывает параметр обратного вызоваcallback, но eBay ожидаю, что это будет называтьсяcallbackname. Что вам нужно сделать, это добавить свои параметры в карту данных. Убедитесь, что вы используете правильные имена параметров, проверьте документы и используйте метод URL, а не метод заголовка. Надеюсь это поможет

 albinohrn22 мая 2012 г., 00:48
Рабочий пример. Что я сделал, так это то, что я изменил наdataType:'jsonp' добавилjsonp:'callbackname'. Поскольку jQuery по умолчанию вызывает параметр обратного вызова callback, но eBay ожидает, что он будет назван 'callbackname'. Что вам нужно сделать, это добавить свои параметры в карту данных. Убедитесь, что вы используете правильные имена параметров, проверьте @ Докумен и используйте метод URL, а не метод заголовка. Надеюсь это поможет
 Eswar Rajesh Pinapala22 мая 2012 г., 07:27
Albin: Большое спасибо, я получил его на работу. Спасибо за ваш пример. Я ожидал, что response.responseText будет содержать объект, но ответ сам по себе является ответом JSON от eBay. Я смог напечатать его в текстовой области, выполнив, $ ("# eBayXMLResponse"). Val (JSON.stringify (object, null, 4)); JSON.stringify - хороший метод для преобразования json obj в строку. и другие параметры предназначены для форматирования с отступом «4». Резюме: Спасибо Раджеш
 Eswar Rajesh Pinapala21 мая 2012 г., 23:47
Я не думаю, что это работает, потому что, если вы видите мой вызов ajax, я уже отправляю X-EBAY-API-RESPONSE-ENCODING ':' json ',
 Eswar Rajesh Pinapala21 мая 2012 г., 23:50
забавно то, что я наблюдал за заголовками и параметрами запросов и ответов, мне удалось получить ответ json, но все равно ошибка: ресурс интерпретирован как сценарий, но передан с типом MIME text / plain:
 albinohrn21 мая 2012 г., 23:50
Да, я только что видел это. Но как бы вы ни передавали его как параметр, если вы попытаетесь передать его как заголовок, а когда я попробовал, я увидел, что он чувствителен к регистру в @ Докумен они используют JSON.

Я изменил на dataType: 'jsonp' добавил jsonp: 'callbackname'. Поскольку jQuery по умолчанию вызывает параметр обратного вызова callback, но eBay ожидает, что он будет назван 'callbackname'. XML не работал из-за проблемы CRO с eBay (необходимо подтвердить, хотя.)

Использовал консоль chrome для отладки полученного объекта, преобразованного в строку с помощью JSON.Stringify ().

Надеюсь, это кому-нибудь поможет!

Шир, Раджеш

JQuery.ajax () документация, вы можете использовать jsonp и по-прежнему иметь другой тип возвращаемого значения для анализа.

множественные значения, разделенные пробелами: Начиная с jQuery 1.5, jQuery может преобразовывать dataType из того, что он получил в заголовке Content-Type, в то, что вам нужно. Например, если вы хотите, чтобы текстовый ответ обрабатывался как XML, используйте «text xml» для dataType. Вы также можете сделать запрос JSONP, получить его в виде текста и интерпретировать с помощью jQuery как XML: «jsonp text xml». Аналогично, сокращенная строка, такая как «jsonp xml», сначала попытается преобразовать из jsonp в xml, а в случае неудачи - из jsonp в текст, а затем из текста в xml.

Так что, в принципе, все, что вам нужно сделать, это изменить свdataType строка кода для этого:

dataType: ($.browser.msie) ? "jsonp text xml" : "xml",

Или вы можете добавить&responseencoding=JSON параметр для вашего URL, как указано в другой ответ.

 Eswar Rajesh Pinapala21 мая 2012 г., 23:46
Resource интерпретируется как Script, но передается с текстом MIME типа / plain: {" Open.api.ebay.com / ...».}
 Eswar Rajesh Pinapala21 мая 2012 г., 23:52
сорри, я удалил контент-тип, что-то проверял. Однако удаление типа содержимого, похоже, не помогает.
 Eswar Rajesh Pinapala21 мая 2012 г., 23:42
Спасибо за Ваш ответ. Документ выглядит многообещающим, но, похоже, не работает. также я добавил кодирование отклика к Json в моей работе URL, dint. однако я получаю сообщение об ошибке при попытке использовать тип данных: "jsonp text xml"
 Styxxy21 мая 2012 г., 23:45
Какая у вас ошибка
 Styxxy21 мая 2012 г., 23:50
Удалите опцию contentType, похоже, что все портится. (Почему вы установили его на application / x-javascript?)

Ваш ответ на вопрос