不可或缺的xmlhttp.setRequestHeader()

 //  为什么 b c  在send方法里的  得不到值   没有  setHeader  指定  提交的编码方式

window.onload = function(){
    document.getElementById("ok").onclick = function(){
  //第一步:创建ajax引擎
  var xmlHttp = ajaxFunction();
  //第二步:处理服务器响应的数据
  /**
   * onreadystatechange = function(){}:
   *      * 事件处理函数(监听器),可以监听服务器端的每一步的操作,操作之后的结果通知给客户端浏览器
   *         * 这依靠更新 XMLHttpRequest 对象的 readyState 来实现
   *         *  0 代表未初始化。 还没有调用 open 方法
      1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
      2 代表已加载完毕。send 已被调用。请求已经开始
      3 代表交互中。服务器正在发送响应
      4 代表完成。响应发送完毕
                   * 每次 readyState 值的改变,都会触发 readystatechange 事件
                   * 在XMLHttpRequest对象同时存在status对象,存放访问服务器的状态码,代表访问服务器是否成功
                   *    404 没找到页面(not found)
      403 禁止访问(forbidden)
      500 内部服务器出错(internal service error)
      200 一切正常(ok)
      304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )
   */
  xmlHttp.onreadystatechange = function(){
//   alert("readyState="+xmlHttp.readyState);
//   alert("status="+xmlHttp.status);
   if(xmlHttp.readyState == 4){
    if(xmlHttp.status == 200 || xmlHttp.status == 304){
     //接收服务器响应的结果
     var data = xmlHttp.responseText;
     alert("data="+data);
    }
   }
  }
        //第三步:打开一个连接
  /**
   * open(method, url, asynch)
   *   * method:请求类型,提供2种类型,“GET”或”POST”的字符串
   *   * url:请求服务器的访问路径,可以是绝对路径也可以是相对路径
   *   * asynch:表示请求是否要异步传输,默认值为true(异步),同步为false
   *  
   */
  xmlHttp.open("post","../testServlet?a=8&timestamp="+new Date().getTime(),true);
  /**如果是post请求,需要重新设置编码格式,这样可以通知服务器当前的请求的格式符合UTF-8的编码*/
  xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  //第四步:向服务器发送数据
  /**
   * send(data):
   *   * data:客户端向服务器端发送的数据,格式:a=8&b=9&c=10
   */
  /**使用get请求时send方法参数时null,如果传值的话,服务器也接受不到*/
  xmlHttp.send("b=12&c=1");

<End>

 

一、为何要用到setRequestHeader
通 常在HTTP协议里,客户端像服务器取得某个网页的时候,必须发送一个HTTP协议的头文件,告诉服务器客户端要下载什么信息以及相关的参数。而 XMLHTTP 就是通过HTTP协议取得网站上的文件数据的,所以也要发送HTTP头给服务器。 但是 XMLHTTP 默认的情况下有些参数可能没有说明在HTTP头里,这是当我们需要修改或添加这些参数时就用到了 
setRequestHeader 方法。

二、setRequestHeader参数详解
使用GET下列参数 XMLObject.setRequestHeader ("CONTENT-TYPE", "application/x-www-form-urlencoded" )
代表的意义:

GET /bb.asp?www=1234 HTTP/1.1 
Accept: */* 
Accept-Language: zh-cn 
UA-CPU: x86 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 
CONTENT-TYPE:application/x-www-form-urlencoded 
Host:ourys.com 
Connection: close 
Cookie: %C3%F7%CC%EC=%B0%CB;ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII

 

注:
1、CONTENT-TYPE:application/x-www-form-urlencoded含义是表示客户端提交给服务器文本内容的编码方式 是URL编码,即除了标准字符外,每字节以双字节16进制前加个“%”表示

2、当然还有其他编码方式,如:CONTENT-TYPE:multipart/form-data 
至于:Content-length 就是表示提交的数据字节大小 
http有几种提交方式,其中比较常用的就是 GET 和 POST

3、这个标志就放在HTTP头开头的地方,这样讲容易理解点 
GET 方式是没有提交内容的,所以 Content-length 在 GET 模式下是无效的. 
GET 传参数的方式就是通过虚拟地址传送,如: 
GET /bb.asp?www=1234 HTTP/1.1 
参数全部就只有 "www=1234" 这么多

4、如果用POST的话就有些不同,POST是将参数放到HTTP后面的,就以上面的HTTP作范例,用POST的方法传参数

POST /bb.asp HTTP/1.1 
Accept: */* 
Accept-Language: zh-cn 
UA-CPU: x86 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 
CONTENT-TYPE:application/x-www-form-urlencoded 
Host: ourys.com 
Content-length: 8 
Connection: close 
Cookie: %C3%F7%CC%EC=%B0%CB;ASPSESSIONIDASDBSDRR=BLEDBIBBCGKBJAKJCFEJKGII

www=1234

这时,数据就需要说明字节大小了

至于 Connection: Close,很明显英文的意思是 连接:关闭 
只是客户端在提交数据时告诉服务器让谁先关闭连接而已。

三、PS:
setRequestHeader方法只是XMLHTTP为添加或修改HTTP头提供的一个接口方法而已, 
至于里面的值则是HTTP协议的含义,当然也可以发自己的东西进去,即使IIS不能识别你的信息也不会报错 
如: 
setRequestHeader ("MyName", "Supermanking" )

虽然IIS不会报错,但这个信息也可以有用,可以在ASP程序里读取HTTP头信息分析是否有 
MyName: Supermanking 
信息,可根据你的需求来做处理

 

 

 

 

 

 

 

你可能感兴趣的:(不可或缺的xmlhttp.setRequestHeader())