Нечетная проблема jQuery - не совсем работает Ajax-запрос к программе на C
У меня есть эта базовая настройка:
- Программа на C открывает сокет для определенного неиспользуемого порта (скажем, 1234) и ждет, специально прослушивая HTTP-запросы.
- Веб-страница на том же компьютере, написанная в основном на CGI, использует jQuery для выполнения запроса AJAX, ориентированного на localhost:1234.
Я хотел бы, чтобы программа на C увидела запрос, взяла некоторые данные из него и ответила простым HTTP-ответом, содержащим некоторые собственные данные. Он наполовину работает: веб-страница видит ответ, читает правильные заголовки HTTP (проверяя это с помощью firebug), но не получает данные ответа. Открытие его в Wireshark показывает, что весь ответ проходит, заголовки и данные вместе, но jQuery, кажется, просто игнорирует сами данные.
JQuery достаточно прост:
$.ajax({ url: "http://localhost:6112",
data: {test1: 'testa', test2: 'testb'},
success: function(d,s,x) {
alert("Data: " + d);
alert("Status: " + s);
alert("Object: " + x);
},
error: function(xhr) {
alert("Error: " + xhr.status);
}
});
Когда я нажимаю кнопку, которая вызывает это, запрос делается; окно "Данные: " появляется пустым; Статус появляется как "Успех", и объект создается. Функция error не вызывается.
Что странно (во всяком случае, для меня), так это то, что если я открою Firefox и укажу localhost:1234
, он загружается точно так, как я ожидал - программа C отвечает данными, указывающими, что я не отправлял никаких данных; Firefox отображает его (в частности, данные ответа) просто отлично. То же самое происходит, если я подключаюсь к этому порту и вручную отправляю (несколько глупо выглядящий) HTTP-запрос. Так что, насколько я знаю, это должно быть что-то необычное с jQuery, но я не знаю, что это может быть!
Я попытался установить параметр dataType в запросе AJAX для различных вещей - text/html, text/plain; Я даже попробовал XML и изменил программу на C, чтобы отправить это вместе. Ничего хорошего - все они делают одно и то же. Веб-страница получает правильные заголовки HTTP, но без данных.
Также нет ошибок, которые я могу найти; Firebug не жалуется; программа на C не жалуется... только одна из тех "очень тихо не работающих" ошибок.
Есть идеи, ребята?
редактировать: добавление фактических запросов, проходящих через Firefox, как и было
Успешный запрос (как, например, просто добавив localhost:6112 в строку URL):
GET / HTTP / 1.1 Хост: localhost:6112 Пользователь-агент: (это странно, что я чувствую себя странно, когда публикую свою строку Пользователь-агент?) Принять: текст / html, приложение /xhtml;q=0,9,*/*;q=0,8 Accept-Language: en-us,en;q=0,7 Keep-Alive: 115 Подключение: keep-alive Успешный ответ: HTTP/1.1 200 ОК Host: localhost Тип контента: текст / обычный Длина контента: 55
<html><head></head><body>Done and done.</body></html>
Заголовки запроса AJAX:
GET /? Test1=testa&test2=testb HTTP/1.1 Хост: localhost:6112 Пользователь-агент: (строка UA) Принять: текст / обычный, */* Accept-Language: en-us,en;q=0,5 Accept-Encoding: gzip, выкачать Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,7 Keep-Alive: 115 Подключение: keep-alive Тип контента: application/x-www-form-urlencoded Реферер: localhost/cgi-bin/runtime.cgi Происхождение: localhost Результирующие заголовки ответа: HTTP/1.1 200 ОК Host: localhost Тип контента: текст / обычный Длина контента: 55
<html><head></head><body>Done and done.</body></html>
(Примечание: поскольку я новичок, мне пришлось обрезать некоторые из этих гиперссылок)
1 ответ
Другой порт на том же веб-сайте все еще нарушает политику домена XHR Cross. Единственный способ, которым он мог бы работать между доменами - это либо JSONP (не поддерживает запросы POST), либо веб-служба прокси на том же сервере.
JSONP является самым простым, он просто добавляет <script>
тег к вашему <head>
на URL, который будет выполнять запрос GET (так пока пока постданных). И вы можете заставить его вызывать обратный вызов JavaScript, добавив "callback =?" Получить параметр для URL-адреса - тогда ответ должен будет вызвать метод javascript, указанный в параметре "обратный вызов". Если это имеет смысл..
JQuery, вероятно, обнаруживает, что это удаленный URL-адрес, и пытается использовать JSONP, но из-за отсутствия обратных вызовов он завершается с ошибкой (и ошибка также не вызывается).