Нечетная проблема 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, но из-за отсутствия обратных вызовов он завершается с ошибкой (и ошибка также не вызывается).

Другие вопросы по тегам