HTTP请求方式 .
2014-03-18 11:22
387 查看
众所周知XMLHttpRequest的open()方法里的第一个参数是用来设置向服务器提交的方式,这是绝对的吗?不一定哦,看看下面的代码。
代码片断如下:
function simpleStrSubmit()
{
var xmlReqFile = createXMLReqFile();
xmlHttp.open("GET","ProcessServlet",true);//指定GET方式提交
xmlHttp.onreadystatechange = processRequest;//回调函数
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send("xml="+xmlReqFile);
}
描述:其中ProcessServlet是一个Servlet
问题:open方法的第一个参数不论写"GET"或是"POST",在ProcessServlet里都是调用的doPost方法??这是为什么?为什么不调用doGet方法???
答案:按照哪种方式提交不是由open()方法的第一个参数完全决定的,还与send()方法有关。
一、当open()方法里指定的是GET,并且
1、send()方法的参数是""或者null,跟踪代码可以知道调用了Servlet中的doGet方法
2、send()方法的参数是地址重写的方式,或者就是一个字符串,都调用doPost方法,例如:
xmlHttp.open("GET",
"ProcessServlet?choose="+document.getElementById("choosejsfile").value,
true);//open里调用GET方法。
xmlHttp.send("aaa=dd"); //a
xmlHttp.send("paramTest"); //b
xmlHttp.send(" "); //c
xmlHttp.send(null); //d
xmlHttp.send(""); //e
对于a、b、c、d、e五中send()函数,只有d和e会调用doGet方法,a、b、c三种方式均调用 doPost方法。
二、当open()方法里指定的是POST,则对于以上5种send()函数,服务器均会调用doPost方法。
所以使用哪种方式提交是由open方法和send方法共同决定的。
这个问题其实是http请求的报文格式的问题
1、如果用GET,是没有报文体的,只有头部,数据应该在GET url?xxxxxxx
报头的末尾是两个CRLF,即GET的情况下,出来url本身是不能直接send数据的。
("url?参数"的大小限制是2048B),即GET的使用范围是小数据量的文本数据。
2、如果是POST,则可以把要POST的数据加到两个CRLF后。
此时常见有两种格式:
(1)、application/x-www-form-urlencoded
这个是把数据的name和value按照a=1&b=2的格式拼接成一个串,然后放在报文体中的。一般只能传递字符型数据。
(2)、multipart/form-data 使用一个特殊的【42位(我忘了,大概是)长的以10几个-开头和一组随机16进制数字+表示浏览器相关的数字表示】的分隔符,来分割报文体中的各个数据段,一般是name,然后两个CRLF,接着是二进制数据。服务器端上传组件就是直接按照这种方式来分割出数据和文件的。
考虑到这些情况就可以方便的模拟表单了。
(个人看法)综上,只有是POST方法时,才能传递URL+参数外的数据,XHR明显是考虑到了这一点。当send的数据存在时,自动使用POST。
代码片断如下:
function simpleStrSubmit()
{
var xmlReqFile = createXMLReqFile();
xmlHttp.open("GET","ProcessServlet",true);//指定GET方式提交
xmlHttp.onreadystatechange = processRequest;//回调函数
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send("xml="+xmlReqFile);
}
描述:其中ProcessServlet是一个Servlet
问题:open方法的第一个参数不论写"GET"或是"POST",在ProcessServlet里都是调用的doPost方法??这是为什么?为什么不调用doGet方法???
答案:按照哪种方式提交不是由open()方法的第一个参数完全决定的,还与send()方法有关。
一、当open()方法里指定的是GET,并且
1、send()方法的参数是""或者null,跟踪代码可以知道调用了Servlet中的doGet方法
2、send()方法的参数是地址重写的方式,或者就是一个字符串,都调用doPost方法,例如:
xmlHttp.open("GET",
"ProcessServlet?choose="+document.getElementById("choosejsfile").value,
true);//open里调用GET方法。
xmlHttp.send("aaa=dd"); //a
xmlHttp.send("paramTest"); //b
xmlHttp.send(" "); //c
xmlHttp.send(null); //d
xmlHttp.send(""); //e
对于a、b、c、d、e五中send()函数,只有d和e会调用doGet方法,a、b、c三种方式均调用 doPost方法。
二、当open()方法里指定的是POST,则对于以上5种send()函数,服务器均会调用doPost方法。
所以使用哪种方式提交是由open方法和send方法共同决定的。
这个问题其实是http请求的报文格式的问题
1、如果用GET,是没有报文体的,只有头部,数据应该在GET url?xxxxxxx
报头的末尾是两个CRLF,即GET的情况下,出来url本身是不能直接send数据的。
("url?参数"的大小限制是2048B),即GET的使用范围是小数据量的文本数据。
2、如果是POST,则可以把要POST的数据加到两个CRLF后。
此时常见有两种格式:
(1)、application/x-www-form-urlencoded
这个是把数据的name和value按照a=1&b=2的格式拼接成一个串,然后放在报文体中的。一般只能传递字符型数据。
(2)、multipart/form-data 使用一个特殊的【42位(我忘了,大概是)长的以10几个-开头和一组随机16进制数字+表示浏览器相关的数字表示】的分隔符,来分割报文体中的各个数据段,一般是name,然后两个CRLF,接着是二进制数据。服务器端上传组件就是直接按照这种方式来分割出数据和文件的。
考虑到这些情况就可以方便的模拟表单了。
(个人看法)综上,只有是POST方法时,才能传递URL+参数外的数据,XHR明显是考虑到了这一点。当send的数据存在时,自动使用POST。
相关文章推荐
- Android客户端采用Http 协议Post方式请求与服务端进行数据交互
- Http 请求方式:Get 与Post
- Android的http两种请求方式
- python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
- Android 网络请求方式之HttpClient,GET,POST,PUT请求使用方法
- 利用httplib.HTTPSConnection 发送post请求的方式
- Android支持https的处理方式1----httpclient请求https的处理方式
- Http请求过程中,get和post请求方式的区别
- 关于手机在wap网络下的 HTTP 请求方式
- WebClient和HttpReuqest两种网络请求的方式
- HTTP协议请求方式:GET 和 POST区别
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- android http协议post请求方式
- http post请求的content-type决定数据提取方式
- C# Get方式请求Http
- Android中使用Volley开源库进行Http网络请求(GET方式)
- java发送post和get请求(1)---HttpURLConnection方式
- C# wnform 请求http ( get , post 两种方式 )
- HTTP 请求方式: GET和POST的比较
- 可以传中文参数的自定义http协议请求方式