Как сделать кросс-доменный ajax в jQuery с dataType 'text'? - PullRequest
4 голосов
/ 23 августа 2011

В моей функции javacript я называю это ajax.Он работает нормально, но только когда я захожу на веб-страницу с сервера firebird.У меня такой же код на моем testing сервере.Ajax запрашивает загрузку некоторых файлов, но только сервер Firebird имеет свои ip-регистры с нашими клиентами, чтобы иметь возможность просматривать их там.Мне нужно сделать то же самое, если я получаю доступ к файлам php с сервера тестирования.Все серверы находятся внутри внутренней сети.

  • Возможно ли использовать для этого dataType text?
  • Нужно ли вносить какие-либо изменения на стороне сервера?

ajax call:

url = "https://firebird"+path+"/tools.php?";    

jQuery.ajax({
    type: 'get',
    dataType: 'text',
    url: url,
    data: {database: database_name, what: 'download', files: files, t: Math.random() },
    success: function(data, textStatus){
        document.getElementById("downloading").innerHTML+=data;
    }
});

Обновление 1

Мое маленькое веб-приложение восстанавливает базы данных, поэтому я могу проводить на них тестирование.Теперь я хочу улучшить его, чтобы я мог подключиться к нашим клиентам и загрузить определенную резервную копию.Наш клиент разрешил только firebird серверам подключаться к своим сетям.Но у меня есть свой собственный сервер, выделенный для testing.Поэтому каждый раз, когда я хочу загрузить базу данных, мне нужно подключиться firebird.Источник моего веб-приложения и папка со всеми резервными копиями смонтированы в одном месте на обоих серверах firebird и testing.Прямо сейчас мое решение (для скачивания) работает, но только от Firebird.Я работаю в основном только на сервере testing.

Обновление 2

Я делаю два вызова Ajax.Один из них - чистый вызов jQuery (думаю, я могу применить к нему любое решение), а другой - вызов ajax из jsTree.Я создал новый вопрос для этого.Мне кажется, что I have to - вариант @zzzz b).

Ответы [ 4 ]

3 голосов
/ 27 августа 2011

Для выполнения кросс-доменных запросов ваши параметры довольно ограничены.Как упоминалось @ Mrchief , вы можете сделать прокси на стороне сервера и jsonp .

Другой вариант - Обмен ресурсами между источниками (CORS) , рабочий проект W3C.Цитата из этого сообщения в блоге :

Основная идея CORS состоит в том, чтобы использовать настраиваемые заголовки HTTP, чтобы браузер и сервер знали достаточно друг о друге, чтобы определить,запрос или ответ должен быть успешным или неуспешным.

Для простого запроса, который использует либо GET, либо POST без пользовательских заголовков, а текст которого является text / plain, запрос отправляется с дополнительным заголовком с именем Origin.Заголовок Origin содержит источник (протокол, имя домена и порт) запрашивающей страницы, так что сервер может легко определить, должен ли он обслуживать ответ.

Вы можете найти несколько примеров в реальном времени.на этом сайте .

Вам потребуется внести изменения на стороне сервера, чтобы принимать запросы CORS.Поскольку у вас есть контроль над сервером, это не должно быть проблемой.Другим недостатком CORS является то, что он может быть несовместим со старыми браузерами.Поэтому, если некоторые из вашей основной аудитории используют несовместимые браузеры, прокси на стороне сервера может оказаться для вас лучшим вариантом.

2 голосов
/ 28 августа 2011

Я просто хочу предложить альтернативу.

Я не слишком уверен в настройке вашей сети, но если у вас есть доступ к DNS, возможно, будет проще, если вы просто предоставите своим серверам произвольный поддоментого же домена.Что-то вроде www.foo.com для веб-интерфейса и firebird.private.foo.com для сервера Firebird.Таким образом, он становится кросс-поддоменом, а не кросс-доменом.Затем где-то в вашем JavaScript на обеих страницах,

document.domain = "foo.com";

Этот джентльмен достиг этого решения здесь .

1 голос
/ 28 августа 2011

У вас есть следующие варианты

a) В качестве типа данных вы используете тип jsonp, но это требует внесения изменений на стороне сервера для передачи данных обратно как json, а не как txt. Это изменение может быть таким простым, как

{
  "text":<your current text json encoded> 
}

и со своей стороны js вы используете это как response.text; Сказав, что если вы получаете текстовый файл для другого домена sm, я не уверен, насколько легко вам изменить код.

б) Другой вариант - вы пишете обработчик / конечную точку на вашем сервере, т.е. в вашем домене, который отправляет HTTP-запрос в этот третий домен, получает файл, и вы отправляете файл обратно своему клиенту, а теперь фактически ваш клиент. разговаривает только с вашим доменом, и вы можете контролировать все. так как большинство ваших вопросов основаны на ruby, вот пример:

req = Net::HTTP.get_response(URI.parse('http://www.domain.com/coupons.txt'))

@play = req.body

Вы можете найти более подробную информацию о том же здесь.

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

0 голосов
/ 28 августа 2011

Еще одна идея - использовать ваш веб-сервер в качестве прокси.Вам нужно будет учесть последствия для безопасности для этого маршрута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...