奇怪的jQuery问题 – 对C程序的Ajax请求不太正常
我有这个基本设置:
- C程序在特定的未使用端口(例如1234)上打开一个套接字并等待,专门监听HTTP请求。
- 主要在CGI中编写的同一台机器上的网页使用jQuery来生成针对localhost:1234的AJAX请求。
我想要的是C程序查看请求,从中获取一些数据,并使用包含自己的一些数据的简单HTTP响应进行响应。 这是半工作:网页看到响应,读取正确的HTTP标头(通过firebugvalidation),但它没有获得响应数据。 在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); } });
当我点击触发该按钮的按钮时,会发出请求; “数据:”框弹出空白; 状态弹出为“成功”,并创建一个对象。 “错误”function不会被调用。
有什么奇怪的(对我而言)是,如果我打开Firefox并将其指向localhost:1234
,它会按照我的预期完全加载 – C程序会响应数据,表明我没有发送数据; Firefox渲染它(特别是响应数据)就好了。 如果我telnet到该端口并手动发送(有点傻看)HTTP请求,也会发生同样的事情。 所以,据我所知,这必须是jQuery的一个时髦的东西,但我不知道它可能是什么!
我已经尝试将AJAX请求中的dataType参数设置为各种东西 – text / html,text / plain; 我甚至尝试过XML并修改了C程序来发送它。 没有好处 – 他们都做同样的事情。 网页获取正确的HTTP标头,但没有数据。
我也找不到任何错误; 萤火虫没有抱怨; C程序没有抱怨……只是其中一个“非常默默无法工作”的错误。
任何想法,伙计们?
编辑:根据要求添加通过Firefox的实际请求
成功的请求(例如,只需将localhost:6112放入URL栏):
GET / HTTP / 1.1 主持人:localhost:6112 用户代理:(发布用户代理字符串后,我觉得很奇怪吗?) 接受:text / html,application / xhtml; q = 0.9,* / *; q = 0.8 Accept-Language:en-us,en; q = 0.7 保持活力:115 连接:保持活力 成功回复: HTTP / 1.1 200好的 主持人:localhost Content-Type:text / plain 内容长度:55
Done and done.
AJAX请求标头:
GET /?test1 = testa&test2 = testb HTTP / 1.1 主持人:localhost:6112 用户代理:(UA字符串) 接受: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 保持活力:115 连接:保持活力 内容类型:application / x-www-form-urlencoded Referer:localhost / cgi-bin / runtime.cgi 来源:localhost 产生的响应标头: HTTP / 1.1 200好的 主持人:localhost Content-Type:text / plain 内容长度:55
Done and done.
(注意:因为我是新手,我不得不裁剪一些超链接)
同一网站上的其他端口仍违反XHR跨域策略。 它可以跨域工作的唯一方法是JSONP(不支持POST请求)或同一服务器上的代理Web服务。
JSONP是最简单的,它的作用基本上只是将标签添加到你的
到url,这将执行GET请求(所以再见postdata)。 你可以通过添加“callback =?”来调用javascript回调。 GET参数到url - 然后响应必须调用'callback'参数中命名的javascript方法。 如果这是有道理的..
jQuery可能检测到它是一个远程URL并尝试使用JSONP,但由于没有回调使其失败(并且也没有调用错误)。