2013-08-26 2 views
4

У меня есть этот MooTools код:MooTools CORS запрос против нативного Javascript

new Request.JSON({ 
    method: 'POST', 
    url: URL, /*URL TO ANOTHER DOMAIN*/ 
    onSuccess: function(r){ 
    callback(r); 
    } 
}).post(data); 

И этот код не будет отправлять запросы POST (OPTIONS только) ... Посмотрите на приведенный ниже код (он прекрасно работает):

var http = null, 
    params = Object.toQueryString(data); 
try { 
    http = new XMLHttpRequest(); 
} catch (e) { 
    try { 
    http = new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch (e) { 
    try { 
     http = new ActiveXObject("Microsoft.XMLHTTP"); 
    } catch (e) { 
     http = null; 
     alert("Your browser does not support AJAX!"); 
    } 
    } 
} 
var url = URL; 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
    var jsonData = JSON.parse(http.responseText); /*OR EVAL*/ 
    callback(jsonData); 
    } 
}; 
http.open("POST", url); 
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
http.send(params); 

EDIT:

Пробовал: .setHeader('Content-Type','application/x-www-form-urlencoded');
Еще Noth ... Где может возникнуть проблема?

Спасибо!

+2

Если он отправляет запрос OPTIONS, это звучит как запрос [предварительный просмотр CORS] (http://stackoverflow.com/questions/8685678/cors-how-do-preflight-an-httprequest), который предполагает, что вы используете непростой заголовок запроса в вашем запросе на межсайтовый сайт. Ваш код, не относящийся к Mootools, устанавливает 'Content-type: application/x-www-form-urlencoded', но ваш код Mootools может и не быть. – apsillers

+0

Попробуйте установить опцию 'headers' в запросе mootools. – Nils

+1

Пробовал: .setHeader ('Content-Type', 'application/x-www-form-urlencoded'); Все еще ничего ... где проблема? – user889349

ответ

8

Это потому, что MooTools связывает некоторые дополнительные материалы с заголовками запросов.

например. если ваш Htaccess говорит:

Header set Access-Control-Allow-Origin: * 

вам нужно обработать ваш запрос так:

var foo = new Request({ 
    url: 'http://fragged.org/Epitome/example/data/', 
    method: 'get', 
    onComplete: function (data) { 
     // returns an object with name and surname 
     new Element('div[html="{name} {surname}"]'.substitute(JSON.decode(data))).inject(document.body); 
    } 
}); 

// need to remove that or CORS will need to match it specifically 
delete foo.headers['X-Requested-With']; 
foo.send();  

Вот почему вы видите только ОПЦИИ до полета. Вам это не нравится :)

Вы можете изменить .htaccess так же, как и X-Requested-With, что, возможно, является дополнительной «защитой».

См. http://jsfiddle.net/7zUSu/1/ для рабочего примера. Я сделал это некоторое время назад, когда захотел получить это изменение для запроса https://github.com/mootools/mootools-core/issues/2381.

+1

Отличный ответ, как обычно! Благодарю. – user889349

+0

Я не знаю, как поблагодарить вас; это, скорее всего, спасло меня несколько часов вытягивания волос. –

0

Что вы подразумеваете под (ОПЦИИ)? Оба примера отправляют запрос POST, разница только в заголовках запроса Accept.

MooTools отправляет Accept: application/json, в то время как родной отправляет Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.

Это может повлиять на реакцию сервера.

Смежные вопросы