Обратный engeering междоменных запросов POST, которые используют Ext.Ajax.request - PullRequest
5 голосов
/ 29 сентября 2011

Я работаю со скриптом, который, кажется, использует Ext.Ajax.request (с ExtJS 3) для отправки междоменных запросов - некоторые из них POST-запросов. В настоящее время рассматривается вопрос о том, чтобы отойти от ExtJS3 (возможно, отойти от ExtJS в целом), но быстрая попытка использования XMLHttpRequest не сработала; Как я могу узнать, какой метод используется для отправки этих междоменных запросов?

Ответы [ 4 ]

3 голосов
/ 18 октября 2011

В настоящее время я использую ExtJS 3.3.1, я еще не переключился на 4, но, скорее всего, произойдет, когда появится новый проект. Не глядя на источник Ext, я могу сказать вам, что они используют JSONP для выполнения этой задачи, это единственный способ сделать междоменный вызов AJAX, потому что JavaScript должен соблюдать тот же самый политика происхождения .

Вы пытаетесь сделать чистую JS-реализацию JSONP? Или вы уже используете библиотеку JS?

Редактировать

Согласно нашим комментариям ... они делают POST-запросы. Это невозможно с JSONP. Так что, насколько я могу судить, они используют iframe подобную хитрость. Это тот же трюк, который используется для загрузки файлов в старых браузерах AJAX.

Эта ссылка объясняет это более подробно.

Кроме того, тот же метод (iframe to, POST, загрузка файла) используется в Загрузчике файлов Valum . Намного легче следовать, чем источнику ExtJS.

0 голосов
/ 20 октября 2011

JSONP немного взломан, но пригоден для использования.

Однако рассмотрите возможность использования CORS, если вы управляете пересекающимися доменами. CORS включает в себя размещение заголовка (Access-Control-Allow-Origin) в ответах с веб-сайта: http://enable -cors.org /

Он поддерживается браузерами IE 8+ (caveat, natch), Firefox и WebKit. Предостережение IE заключается в следующем: IE использует другой объект запроса (XDomainRequest) для запросов CORS. Если вам нужна поддержка Opera, вам нужно использовать JSONP или полифилл (что-то вроде https://github.com/gimite/web-socket-js/,, для которого требуется Flash).

Если вы не контролируете домены, о которых идет речь, вы можете попросить их поддержать CORS.

0 голосов
/ 18 октября 2011

Онлайн-документация Ext JS 3.4 предоставит вам модель наследования классов Ext.Ajax, которую можно использовать для отслеживания исходного кода, соответствующего вызову метода Ext.Ajax.request. Однако вместо того, чтобы тратить больше времени и ресурсов на воссоздание колеса, я бы предложил внедрить собственный класс Ext JS Ext.data.ScriptTagProxy в уже существующие хранилища с помощью параметра конфигурации proxy, чтобы упростить ваши междоменные запросы на удаленные магазины. Ниже приведен сокращенный пример того, на что я ссылаюсь.

Пример

var myJsonStore = new Ext.data.JsonStore
({
    autoLoad : true,
    proxy : new Ext.data.ScriptTagProxy
    ({
        url : 'http://www.cross-domain.com/file.php'
    }),
    fields : ['myIdColumn','myCharColumn','myDateColumn']
});

Сложение

Поскольку вы намереваетесь отказаться от использования Ext JS, обратитесь к библиотеке ACD (AJAX Cross Domain) .

0 голосов
/ 17 октября 2011

Вы можете попробовать использовать jsonp Пример Jquery:

$.ajax({
  url: "test.php",
  dataType: "jsonp"
  success: function(data){
     console.log(data)
  }
});

Или, если у вас есть доступ к запрошенному контенту, вы можете установить заголовок Access-Control-Allow-Origin. Пример PHP:

header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
...