【问题标题】:Odd jQuery problem - Ajax request to a C program not quite working奇怪的 jQuery 问题 - 对 C 程序的 Ajax 请求无法正常工作
【发布时间】:2011-04-19 09:03:28
【问题描述】:

我有这个基本设置:

  • C 程序在特定未使用的端口(比如 1234)上打开一个套接字并等待,专门监听 HTTP 请求。
  • 同一台机器上的网页,主要用 CGI 编写,使用 jQuery 发出针对 localhost:1234 的 AJAX 请求。

我希望 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 可以很好地呈现它(特别是响应数据)。如果我 telnet 到那个端口并手动发送一个(看起来有点傻的)HTTP 请求,也会发生同样的事情。所以,据我所知,这一定是 jQuery 的一些时髦的东西,但我不知道它可能是什么!

我尝试将 AJAX 请求中的 dataType 参数设置为各种内容——text/html、text/plain;我什至尝试了 XML 并修改了 C 程序来发送它。不好——他们都做同样的事情。网页获取正确的 HTTP 标头,但没有数据。

我也找不到任何错误弹出; Firebug 没有抱怨。 C 程序没有抱怨......只是那些“非常安静地不工作”的错误之一。

各位,有什么想法吗?


编辑:按要求添加通过 Firefox 的实际请求

请求成功(如将 localhost:6112 扔进 URL 栏):

获取/HTTP/1.1 主机:本地主机:6112 User-Agent:(我对发布我的 User-Agent 字符串感到奇怪吗?) 接受:text/html, application/xhtml;q=0.9,*/*;q=0.8 接受语言:en-us,en;q=0.7 保活:115 连接:保持活动 成功响应: HTTP/1.1 200 正常 主机:本地主机 内容类型:文本/纯文本 内容长度:55
<html><head></head><body>Done and done.</body></html>

AJAX 请求标头:

GET /?test1=testa&test2=testb HTTP/1.1 主机:本地主机:6112 用户代理:(UA 字符串) 接受:文本/纯文本,*/* 接受语言:en-us,en;q=0.5 接受编码:gzip,deflate 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活:115 连接:保持活动 内容类型:application/x-www-form-urlencoded 参考:localhost/cgi-bin/runtime.cgi 来源:本地主机 产生的响应标头: HTTP/1.1 200 正常 主机:本地主机 内容类型:文本/纯文本 内容长度:55
<html><head></head><body>Done and done.</body></html>

(注意:因为我是新手,所以我不得不裁剪一些超链接)

【问题讨论】:

  • 你能发布失败的HTTP请求和成功的HTTP请求吗? (Firefox 实时 HTTP 标头)
  • 尝试 .get (api.jquery.com/jQuery.get) 检索数据。这不会像 .ajax 那样进行数据解析。

标签: jquery c ajax


【解决方案1】:

同一网站上的不同端口仍然违反 XHR 跨域政策。它可以跨域工作的唯一方法是 JSONP(不支持 POST 请求)或同一服务器上的代理网络服务。

JSONP 是最简单的,它的作用基本上只是将&lt;script&gt; 标记添加到您的&lt;head&gt; 到url,这将执行一个GET 请求(所以再见postdata)。您可以通过添加“callback=?”使其调用 javascript 回调。 GET 参数到 url - 然后响应必须调用在“回调”参数中命名的 javascript 方法。如果这有意义..

jQuery 可能检测到它是一个远程 URL 并尝试使用 JSONP,但是因为没有回调导致它失败(并且错误也不会被调用)。

【讨论】:

  • 如果我使用JSONP,从服务器程序的角度来看有什么不同?我还可以使用相同的 HTTP 标头吗,还是有时髦的 JSONP 格式?
  • 对于服务器来说这无关紧要,除了你必须通过 GET 而不是 POST 接收所有数据。并添加回调=? (带有问号,jQuery 将替换它)到 url,然后在服务器上,您只需将 JSON 响应包装在回调中的名称中。例如,如果 jQuery 发送 callback=myFunc 然后你用 myFunc({yourjsonobject}); (并为 javascript 发送正确的 Content-Type 标头)
  • 例如,您的 URL 将是 http://localhost:6112/?test1=testa&amp;test2=testb&amp;callback=?
  • 我还看到你刚刚发布了你的标题,完美的例子,你可以看到 jQuery 已经在执行一个 GET 请求,参数附加到查询字符串。
  • 好收获。我在尝试从 apache 连接到 tomcat 时遇到了同样的问题。
猜你喜欢
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2012-05-10
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多