HTTP post上传 小纪

来源:互联网 发布:qq飞车幽浮数据 编辑:程序博客网 时间:2024/06/14 10:18

POST上传数据

URL方面提交时,浏览器不做修正,需要自己将不合法的地方转化成16进制的码值。

例子如下:

如果其URL值存在非法字符(如中文字符),应将其进行URL Encoding处理。URL Encoding的处理方法如下:

  • 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
  • 特殊字符 "."、"-"、"*" 和 "_" 保持不变。
  • 空格字符 " " 转换为一个加号 "+"。
  • 所有其他字符都是不安全的,因此首先使用一种编码机制将它们转换为一个或多个字节。然后对每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。

将“中文”两个字符进行URL Encoding所得到的值就是“%E4%B8%AD%E6%96%87”。


Content type很重要,因为post方式将数据放在了request body中,而request中数据的编码方式由content type决定

例子如下

一、当content type的值为application/x-www-form-urlencoded时

<form action="checkUser.html" method="POST">  
    <input type="hidden" name="opt" value="中文"/>  
    <input type="text" name="username" value="yyy"/>  
    <input type="text" name="age" value="zzz"/>  
    <inupt type="submit" value="submit"/>  
</form>  

表单提交时,HTTP头部信息如下:
POST /hello/checkUser.html HTTP/1.1
Accept: */*
Referer: http://localhost:8000/hello/index.jsp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8000
Content-Length: 43
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=4EF9C5B81356481F470F3C60D9E77D94
opt=%E4%B8%AD%E6%96%87&username=yyy&age=zzz

传递的数据参数都被放在了request body中(cookie后面的部分),header中比get方式多规定了content-length和content-type,URL上没有跟数据。

二、当content type的值为multipart/form-data时

<form action="checkUser.html?opt=xxx" method="POST"  
        enctype="multipart/form-data">   
    <input type="text" name="username" value="yyy"/>   
    <input type="text" name="age" value="zzz"/>  
    <input type="file" name="file" />   
    <inupt type="submit" value="submit"/>  
</form>
  
表单提交时HTTP头部信息如下:
POST /hello/checkUser.html?opt=xxx HTTP/1.1
Accept: */*
Referer: http://localhost:8000/hello/index.html
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d931c5d043e
Accept-Encoding: gzip, deflate
Host: localhost:8000
Content-Length: 382
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=6FE3D8E365DF9FE26221A32624470D24
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="username"
yyy
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="age"
zzz
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="file"; filename="C:\1.txt"
Content-Type: text/plain
hello 
-----------------------------7d931c5d043e

当multipart传输时,opt参数跟在了URL后面,其他参数被放在了request body中(cookie后面的部分),content-type中还规定了一个boundary,我的理解这就是个分割线(为了分割出不同数据的边界而存在的)。有意思的是request body里面的内容,每个数据都需要申明自己的内容类型,也就是content-disposition这个参数,然后是name(key值名称),换行!!!!
val值。当数据是文件时可以看例子中的写法,很清楚的写明了。

0 0
原创粉丝点击