// 为什么 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×tamp="+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
信息,可根据你的需求来做处理