使用GET方法请求HTTP下载文件
参考自https://m.elecfans.com/article/1002395.html
GET是用于指令的命令请求网页或文件内容,例如.html,.htm和.txt。
GET消息至少包含三行(所有行都以回车换行符终止)
GET消息至少包含三行
HTTP GET请求是一个从客户端到服务器的请求信息包,主要是请求获取服务器上的某个资源。它是一个很基本的请求,通常只从服务器获取数据,不向服务器发送数据。
GET请求的格式如下:
GET /path HTTP/1.1
Header1: value1
Header2: value2
Header3: value3
其中,第一行是请求行,包含方法(GET)、路径和协议版本;接下来是一系列头部,每个头部由一个名称和一个冒号、一个空格和一个值组成,以换行符结束。
但是,你的问题似乎是关于“至少包含三行”,这可能是一个误解。实际上,GET请求至少包含两行:一行是请求行,另一行是结束行(通常是一个空行)。头部是可选的,可以包含零个或多个。
例如,以下是一个简单的GET请求:
GET /index.html HTTP/1.1
Host: www.example.com
这个请求只有两行,因为请求行和头部信息之间需要一个空行。这是一个合法的GET请求,但它没有包含三行。
如果你需要包含三行以上的信息,你可以添加额外的头部,如Cookie或Authorization,如下所示:
GET /index.html HTTP/1.1
Host: www.example.com
Cookie: session_id=abc123
这个请求现在有三行,一行是请求行,一行是头部(Cookie),一行是结束行。这也是一个合法的GET请求。
hex值
47 45 54 20 2F 6F 74 61 2F 68 61 72 64 77 61 72 65 2F 53 54 4D 33 32 46 34 30 37 45 53 50 38 32 36 36 42 4B 41 50 50 2F 75 73 65 72 5F 63 72 63 2E 62 69 6E 20 48 54 54 50 2F 31 2E 31 0D 0A 48 6F 73 74 3A 20 6D 6E 69 66 2E 63 6E 0D 0A 52 61 6E 67 65 3A 20 62 79 74 65 73 3D 30 2D 31 30 32 33 0D 0A 0D 0A
//注意结尾两个有\r\n
浏览器访问服务器常用的方式有GET和POST两种,GET方式只发送HTTP消息头,没有消息体,也就是除了要GET的基本信息之外不向服务器提供其他信息,网页表单(FROM)的默认提交方式就是用GET方式,它会把所有向服务器提交的信息都作为URL后面的参数,如a.asp?a=1&b=2这样的方式。而当要提交的数据量很大,或者所提交内容不希望别人直接看到时,应该使用POST方式。POST方式提交的数据是作为HTTP消息体存在的,例如,写一个网页表单:
<form method=post> <input type=text name=text1> <input type=submit> </form>
访问此网页,并在表单中填入一个“haha”,然后提交,可以看到此次提交所发送的信息如下:
POST /form.asp HTTP/1.1 Accept: */* Referer: http://localhost:8080/form.asp Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: localhost:8080 Content-Length: 10 Connection: Keep-Alive Cache-Control: no-cache Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKPtext1=haha
前面关键字从“GET”变为了“POST”,Content-Type变成了“application/x-www-form-urlencoded”,后面内容并无大变化,只是多了一行:Content-Length: 10,表示提交的内容的长度。空行后面是消息体,内容就是表单中所填的内容。注意此时发送的内容只是“Name=Value”的形式,表单上其他的信息不会被发送,所以想直接从服务器端取得list box中所有的list item是办不到的,除非在提交前用一段script把所有的item内容都连在一起放到一个隐含表单域中。
如果是用表单上传文件,情况就要复杂一些了,首先是表单声明中要加上一句话:enctype='multipart/form-data',表示这个表单将提交多段数据,并用HTML:input type=file来声明一个文件提交域。
表单内容如下:
<form method=post enctype='multipart/form-data'>
<input type=text name=text1>
<input type=file name=file1>
<input type=submit>
</form>
我们为text1输入文字:hehe,为file1选择文件haha.txt,其内容为“ABCDEFG”,然后提交此表单。提交的完全信息为:
POST /form.asp HTTP/1.1
Accept: /
Referer: http://localhost:8080/form.asp
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d62bf2f9066c
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Content-Length: 337
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKP
-----------------------------7d62bf2f9066c
Content-Disposition: form-data; name="text1"
hehe
-----------------------------7d62bf2f9066c
Content-Disposition: form-data; name="file1"; filename="H:\Documents and Settings\Administrator\桌面\haha.txt"
Content-Type: text/plain
ABCDEFG
-----------------------------7d62bf2f9066c--
显然这个提交的信息要比前述的复杂很多。Content-Type变成了“multipart/form-data”,后面还多了一个boundary,此值是为了区分POST的内容的区段用的,只要在内容中遇到了此值,就表示下面要开始一个新的区段了,每个区段的内容相对独立。如果遇到的是此值后面连着两个减号,则表示全部内容到此结束。每个段也分为段头和段体两部分,用空行隔开,每段都有自己的类型和相关信息。如第一区段是text1的值,它的名称是“text1”,值为“hehe”。第二段是文件内容,段首里表明了此文件域的名称“file1”和此文件在用户磁盘上的位置,后面就是文件的内容。
如果我们想要自己写一个上传文件组件来接收HTML表单传送的文件数据,那么最核心的任务就是解析此数据包,从中取得需要的信息。