3

我是 jQuery 新手,想使用普通的 HTTP 1.0 发出 POST 请求并关闭连接,而不是当前保持活动状态的 HTTP 1.1 连接。

下面是发布帖子的按钮的 onClick 处理程序。

$( "#certGenBtn" ).click( function( event ) {
$.ajax({
  type: "POST",
  url: "http://localhost:9099/",
  data: { testVal : "data" },
  success: function( data ) {
              alert( "whoops" );
           },
  beforeSend: function( xhr ) {
                  xhr.setRequestHeader( "Connection", "close" );
              }
    });
});

在服务器端转储的原始输出如下:

POST / HTTP/1.1
Host: localhost:9099
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: */*
Accept-Language: en-ZA,en-GB;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/  
Content-Length: 12
Origin: http://localhost
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

testVal=data

连接关闭标头被“忽略”,并且连接对服务器保持打开状态,因此最后一行testVal=data只有在我重新加载页面后才能通过(我认为这是因为连接随后被浏览器关闭)。我认为这是我遗漏的非常简单和/或愚蠢的东西,但在文档中看不到任何内容。

4

2 回答 2

1

1) 根据 HTTP 1.1 规范,Connection: close是一个有效的标头:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

尝试使用 headers 键而不是 beforeSend 添加它怎么样?

.ajax({

   ....
   headers: {Connection: close},

});

2) jquery 文档为 beforeSend 函数指定以下函数签名:

beforeSend 
Type: Function( jqXHR jqXHR, PlainObject settings )

因此,您也可以尝试将标头添加到设置对象而不是 jqXHR 对象。

好吧,我测试了您的原始代码以及我的建议,但没有一个成功。看起来 XMLHttpRequest 规范禁止设置 Connection 标头:

setRequestHeader(header, value) 方法必须运行以下步骤:

如果标头与以下标头之一不区分大小写,则终止这些步骤:

... 联系 ...

上述标头由用户代理控制,以使其控制传输的这些方面。这在一定程度上保证了数据的完整性。
http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method

于 2013-06-12T10:24:30.250 回答
1
var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()
于 2014-02-15T06:58:17.423 回答