Нечетная проблема jQuery - не совсем работает Ajax-запрос к программе на C - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть такая базовая настройка:

  • Программа 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 не жалуется ... только одна из тех "очень тихих не работающих" ошибок.

Любые идеи, ребята?


edit: Добавление фактических запросов, проходящих через Firefox, в соответствии с запросом

Успешный запрос (например, просто добавление localhost: 6112 в строку URL):

GET / HTTP/1.1
Host: localhost:6112
User-Agent: (is it weird that I feel weird about posting my User-Agent string?)
Accept: text/html, application/xhtml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7
Keep-Alive: 115
Connection: keep-alive

Successful response:
HTTP/1.1 200 OK
Host: localhost
Content-Type: text/plain
Content-Length: 55
<html><head></head><body>Done and done.</body></html>

Заголовки запросов AJAX:

GET /?test1=testa&test2=testb HTTP/1.1
Host: localhost:6112
User-Agent: (UA string)
Accept: text/plain, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Referer: localhost/cgi-bin/runtime.cgi
Origin: localhost

Resulting response headers:
HTTP/1.1 200 OK
Host: localhost
Content-Type: text/plain
Content-Length: 55
<html><head></head><body>Done and done.</body></html>

(Примечание: поскольку я новичок, мне пришлось обрезать некоторые из этих гиперссылок)

1 Ответ

2 голосов
/ 30 сентября 2010

Другой порт на том же веб-сайте все еще нарушает политику домена XHR Cross.Единственный способ, которым он мог бы работать между доменами, - это либо JSONP (не поддерживает запросы POST), либо прокси-веб-сервис на том же сервере.

JSONP - самый простой способ, в основном он просто добавляет <script>пометьте свой <head> URL-адрес, который будет выполнять запрос GET (пока, пока, постданные).И вы можете заставить его вызывать обратный вызов JavaScript, добавив «обратный вызов =?»GET параметр для URL - ответ должен будет вызвать метод javascript, указанный в параметре 'callback'.Если это имеет смысл ..

jQuery, вероятно, обнаруживает, что это удаленный URL-адрес, и пытается использовать JSONP, но из-за отсутствия обратных вызовов происходит сбой (и ошибка также не вызывается).

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