-2

使用 AJAX 发布表单

我的 AJAX 脚本以前不能正常工作(它不会发送数据),但设置请求标头可以解决问题。它工作得很好,但我想了解为什么需要它们才能工作。谢谢 :-)

//Send the proper header information along with the request 
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
http.setRequestHeader("Content-length", params.length); 
http.setRequestHeader("Connection", "close"); 

javascript

function request(elm, type, url, str, fn) { 
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
    if (xhr.readyState==4 && xhr.status==200)
    {
        if (!fn) elm.innerHTML=xhr.responseText; 
        else fn(xhr);
    }
}
      xhr.open(type, url, true);
      //yay it works with this :-)
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr.send(str);
}

var form = document.getElementById("form_login")
var btnLogin = form.getElementsByClassName("btn")[0];
addEvent(btnLogin, "click", function(e) 
{
    preventDefault(e);
    var post ="",input,inputs = form.getElementsByClassName("input");
    for (var i=0, l=inputs.length; i<l; i++) 
    {
        input = inputs[i].getElementsByTagName("input")[0];
        post += input.name + "=" + encodeURI(input.value) + "&";
    }
    post = post.substr(0,post.length-1);
    var help = form.getElementsByClassName("help")[0];
    request(help, "POST", "user/login-exe.php?dt='" + new Date() + "'", post);
});

如果它全部有效,它会将用户记录在该位中,但不会显示。

4

2 回答 2

3

这不是严格要求,PHP 只会$_POST在请求指定 content-type 时自动填充"application/x-www-form-urlencoded".

您仍然可以访问这些值

file_get_contents("php://input");

事实上,任何服务器都应该允许您访问原始请求正文。

其他标题没有做任何事情,浏览器将不允许您按照指定的方式更改它们。如果您能够更改它们,您可能会Content-Length每次都报告错误。因为.length计算 UTF-16 代码单元,其中 asContent-Length必须以字节为单位。

参考:http ://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method

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

  • 接受字符集
  • 接受编码
  • 访问控制请求标头
  • 访问控制请求方法
  • 联系
  • 内容长度
  • 曲奇饼
  • 饼干2
  • 内容传输编码
  • 日期
  • 预计
  • 主持人
  • 活着
  • 起源
  • 推荐人
  • TE
  • 预告片
  • 传输编码
  • 升级
  • 用户代理
  • 通过
于 2012-08-12T12:36:51.773 回答
0

1.) a 的“Content-type”标头<form>:指定在content-type将表单数据提交到服务器时对表单数据集进行编码。

application/x-www-form-urlencoded:表示将表单的数据编码为a。)控件名称和值按它们出现的顺序列出;控件名称与它的值由“=”分隔,控件名称和值由“&”分隔 b) 控件名称和值被转义。空格字符被替换为“+”,其他保留字符被转义,如RFC1738中所述。

2) “Content-length”:这个标头以十进制八位字节表示消息正文的大小 - HTTP 标头中的“Content-Length”字段是什么?

3) 连接:连接的状态。

我认为不需要设置“连接

于 2012-08-12T12:49:19.293 回答