Http请求分析
一个Http请求一般始于如下几种方式:
1.在浏览器中输入一个URL地址
2.网页中的一个超链接
3.Response.Redirect("http://www.sohu.com")在后台进行重定向
4.Form表单提交
前三种方式都是以Get方式发起请求。第四种方式可以以Get方式发起请求,也可以以Post方式发起请求,只需要设置<form action="" method="Get/Post"></form>的method属性即可,默认该属性值为Get.
当客户端发起一个Http请求到服务端时,会传输一个Http请求消息给服务端,标准的Http请求消息格式如下:
请求行(request-line)——请求行的格式为:请求方式_资源路径_http版本号(Get http://www.sohu.com/Default.aspx HTTP/1.1)
消息头(headers)——说明服务器要使用的附加信息(ContentType:application/json Content_Length:18 等等其他头信息)
回车换行(CRLF)——表明头部信息结束
主体数据(request-body)——需要传输到服务端的数据内容,以Post方式请求时才会有该项数据。(username=tom&age=21)
回车换行(CRLF)——表明主体数据信息结束
需要说明的是:
1.当一个Http请求时Get方式的请求时,请求消息中只有前三项,而没有主体数据。当以Post方式请求时,会包含上述五项信息。
2.无论是Get请求还是Post请求,请求行中的资源路径必须是application/x-www-form-urlencoded方式编码。Get请求时,浏览器会自动对其进行UrlEncode。Post请求时,浏览器不会自动进行UrlEncode,所有需要手动对资源路径进行UrlEncode.
3.Post请求时,请求消息中存在主体数据,主体数据的编码方式由消息头中的ContentType属性来设置,主体数据的长度由Content_Length来设置。故在进行一些异步的Post请求时,需要设置ContentType属性。如果使用form表单进行Post请求时,只需要设置form元素的encType属性即可,浏览器会在请求消息的消息头中加入ContentType属性,并且值encType的值。如果没有设置encType属性值,默认会将ContentType设置为application/x-www-form-urlencoded。
4.form元素进行请求时,如果是Get方式进行请求,action标签属性中如果存在"?子句",GET方式将会忽略这个子句。浏览器会自动将表单域的元素的name和value组成键值对放在请求的Url后面,如http://localhost/Default.aspx?age=21。如果以Post方式进行请求,action标签属性中存在"?子句",Post方式会保留这个子句,服务端也可以获得这个子句。
5.如果form元素进行请求时,form内含有文件上传控件,需要上传文件数据是,encType要设置成"multipart/form-data"。