HTTP的GET/POST方式有何区别?这是一个老生常谈的问题,但老生常谈的问题往往有一些让人误解的结论。本文将带您浅尝HTTP协议,在了解HTTP协议的同时将会展示许多被人们忽视的内容。在掌握了HTTP协议的过程中我们将自然而然地了解到GET与POST的本质区别。

HTTP请求

从使用者的角度看,一个HTTP请求起始于用户端浏览器上输入的一个URL地址、网页中的一个超链接或提交一个HTML表单等等。但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求。

一个标准的HTTP请求由以下几个部分组成:

[]

在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本;

紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息;

头部信息之后是一个回车换行符(\r\n),用于标明头部信息的结束。

以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body);

主体数据之后是一个回车换行符(\r\n),用于标明主体数据的结束。

请求行(request-line)中的URL部分必须以application/x-www-form-urlencoded方式编码。主体数据(request-body)的编码方式由头部(headers)信息中的Content-Type指定。主体数据(request-body)的长度由头部(headers)信息中的Content-Length指定。

例如,我们可以在IE浏览器上输入下面的网址:http://localhost:8000/nowamagic/index.html

HTTP请求的头部信息如下:

GET /nowamagic/index.html HTTP/1.1

Accept: */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

Host: localhost:8000

Connection: Keep-Alive

Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

上述信息没有request-body部分,这是以GET方式发送的HTTP请求。如果请求中需要附加主体数据,即增加request-body部分,则必须使用POST方式发送HTTP请求。HTML超链接()只能用GET方式提交HTTP请求,HTML表单(

)则可以使用两种方式提交HTTP请求。

HTML表单

HTML表单的使用方法如下:

VALUE

表单中存在各种类型的表单域标签,如、及。每一种表单域标签均有NAME与VALUE两种标签属性。这两个标签属性决定了表单提交时传送的属性名及相应的值。

action标签属性指定了表单提交的目标地址,其值可以是完整的URL。如:

如果放置表单的网页与表单提交的目标地址在同一个HTTP服务器上,则目标地址可以用绝对路径表示(绝对路径相对于HTTP服务器)。绝对路径以“/”开头,包括WEB应用上下文及请求。如:

如果放置表单的网页与表单提交的目标地址在同一个WEB应用上下文上,则目标地址可以用相对路径表示(相对路径相对于放置表单的网页)。相对路径不以“/”开头,不包括WEB应用上下文。如:

需要注意的是,action标签属性的值必须符合URL的要求,其编码必须符合application/x-www-form-urlencoded编码规则。如下面的表单:

这样的表单是不符合要求的。如果其URL值存在非法字符(如中文字符),应将其进行URL Encoding处理。URL Encoding的处理方法如下:

字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。

特殊字符 "."、"-"、"*" 和 "_" 保持不变。

空格字符 " " 转换为一个加号 "+"。

所有其他字符都是不安全的,因此首先使用一种编码机制将它们转换为一个或多个字节。然后对每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。

将“中文”两个字符进行URL Encoding所得到的值就是“%E4%B8%AD%E6%96%87”。所以正确的表单应该是:

method标签属性指定了表单的发送方式,发送方式只有两种:GET及POST。当以GET方式发送表单时,发送的HTTP请求没有request-body部分,所以不需要指定enctype标签属性。GET方式只提交表单域中的数据,action标签属性中如果存在?子句,GET方式将不予处理。如下面的表单:

表单提交时没有包括opt属性,HTTP头部信息如下:

GET /hello/checkUser.html?username=yyy&age=zzz HTTP/1.1

Referer: http://localhost:8000/hello/index.html

Accept: */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

Host: localhost:8000

Connection: Keep-Alive

Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

需要注意的是,以GET方式提交表单时,每个表单域的NAME与VALUE要以URL的方式提交,所以每个表单域的NAME与VALUE均要进行URL Encoding处理。这个操作通常是由用户端浏览器完成的。如下面的表单:

其中表单域opt的VALUE是中文字符“中文”,在表单提交时,用户端浏览器会自动将其进行URL Encoding。HTTP头部信息如下:

GET /hello/checkUser.html?opt=%E4%B8%AD%E6%96%87&username=yyy&age=zzz HTTP/1.1

Referer: http://localhost:8000/hello/index.html

Accept: */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

Host: localhost:8000

Connection: Keep-Alive

Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

当以POST方式发送表单时,表单域中的数据将作为request-body提交,action标签属性中的?子句将在request-line中得以保留。如下面的表单:

表单提交时,HTTP头部信息如下:

POST /hello/checkUser.html?opt=xxx HTTP/1.1

Referer: http://localhost:8000/hello/index.html

Accept: */*

Accept-Language: zh-cn

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

Host: localhost:8000

Content-Length: 20

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

username=yyy&age=zzz

需要注意的是,以POST方式提交表单时,action标签属性的值必须是已经进行了URL Encoding处理之后的值,用户端浏览器不会自动处理URL中的非法字符。如下面的表单是不符合要求的:

正确的表单应该是:

在HTTP请求中,request-line总是以application/x-www-form-urlencoded方式编码。enctype标签属性只对request-body起作用。也就是说只有在method="POST"的情况下,设置enctype才起作用。

设置enctype标签属性后,在HTTP请求的头部(headers)信息中会多出一行Content-Type信息,并且request-body部分将会以Content-Type指定的MIME进行编码。这些操作都是由客户端浏览器自动完成的。

在没有指定enctype标签属性时,表单以默认的application/x-www-form-urlencoded方式对request-body进行编码。

如果表单域中的NAME或VALUE含有非法字符(如中文字符),客户端浏览器会自动对其进行URL Encoding处理。如下面的表单:

表单提交时,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

如果表单中包含需要上传的文件数据,则在指定method="POST"的同时还要指定enctype="multipart/form-data"。如下面的表单:

enctype="multipart/form-data">

表单提交时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--

GET与POST的区别

GET方式在request-line中传送数据;POST方式在request-line及request-body中均可以传送数据。

对网上传言的解释

传言1:GET方式对长度有限制;POST方式对长度没限制。

回答:长度限制之说一方面是HTTP客户端(如IE限定URL长度为2083字节,opera 是4050, Netscape 是8192)的限制;另一方面服务器的实现也加入了限制(如果URL长度过长,HTTP服务器会报414错误)。但HTTP协议及URL官方说明均对长度限制则没有规定。

传言2:GET是从服务器上获取数据;POST是向服务器传送数据。

回答:GET方式就没有向服务器传送数据?那么URL中的?子句送的是什么?不论是GET还是POST,都可以向服务器传送数据,只不过传送数据的位置不同;不论是GET还是POST,都要从服务器上获取数据,否则IE浏览器拿什么东西给我们看呢?关键的问题是GET的主要任务是获得数据,但在获得数据前也可以向服务器提交一些数据;POST的主要任务是提交数据,但在提交数据之后服务器也会向用户端返回一些显示用的数据。

传言3:GET不安全,用户能从地址栏上看到传送的数据;POST安全,用户不能从地址栏上看到传送的数据。

回答:POST方式看不到传送的数据是因为IE浏览器做了限制。如果你通过第三方工具看到了POST方式传送的数据,你还能说POST方式是安全的吗?理论上说GET和POST方式都不安全,要不就用不着研究HTTPS了。

html提交表单原理,HTML表单、HTTP Get与Post杂谈相关推荐

  1. Java form表单原理,动态表单及动态建表实现原理[Java编程]

    赞助商链接 本文"动态表单及动态建表实现原理[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下 ...

  2. CRC16查表法原理

    Preface CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结. 一.CRC校验 ...

  3. 跳跃表的原理和实现以及应用

    目录 跳跃表的原理 跳跃表的实现步骤分析 代码实现 跳跃表的应用 跳跃表的原理 学过数据结构的都知道,在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时 ...

  4. html表单代码原理,HTML表单form

    源码下载 窗口HTML结构 账号:密码: 代码解析 最外层父元素form是块元素,form表单的属性action.method.name都是关于http通信功能的属性,不影响表单form块元素的布局和 ...

  5. php ci提交表单验证,ci表单验证代码

    概述 这是只考虑php对表单数据的接收处理.至于js部分以前会结合validate来讲解下 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显示了. 你填写并 ...

  6. php提交表单处理,PHP表单处理

    我们可以在PHP中创建和使用表单.要获取表单数据,需要使用PHP超级元组:$_GET和$_POST. 表单请求可以是get或post. 要从get请求中检索数据,需要使用$_GET,而$_POST用于 ...

  7. 使用ajax提交图片,提交已经注入文件的表单给后台上传图片 使用ajaxsubmit

    使用jquery form插件进行异步带文件的表单提交 引入form插件与jquery 的js文件后 获取表单的jq对象 然后.ajaxSubmit提交表单即可 实现添加品牌的异步表单提交 funct ...

  8. html把保留图片改为提交按钮,如何制作图片按钮,并为图片按钮添加提交表单和重置表单功能...

    网页中有表单,表单的默认按钮样式不是很好看,很多人为了美观使用图片做按钮. 今天中国在 一.图片按钮的制作方法 1. 定义图像形式的提交按钮. 2.用CSS把图片设为按钮的背景 3.作用,设置其bac ...

  9. js提交成功后,清空表单

    js提交成功后,清空表单: $("form")[0].reset(); //清空表单 转载于:https://www.cnblogs.com/bagnliu/p/8205536.h ...

最新文章

  1. CVPR 2021| 基于深度图匹配的鲁棒点云配准框架
  2. windows下nginx+tomcat分布式集群部署
  3. php 获取日期标签的值,在php中获取标签的选定索引值
  4. SqlServer高级特性--存储过程
  5. 《CCNP安全Secure 642-637认证考试指南》——第8章 配置与实施路由式数据面安全...
  6. java 当一个文本框有值时另一个文本框置灰_【农行DevOps进行时】基于PaaS的持续集成/持续交付实践 | IDCF...
  7. C/C++ list链表的理解以及使用
  8. vim显示行号_使用 vim 不得不看的 2 个 tips
  9. 理解 Delphi 的类(十) - 深入方法[21] - 开放数组参数
  10. (day 22 - 全排列问题 dfs+剪枝+回溯 )剑指 Offer 38. 字符串的排列
  11. redhat linux raid5,Linux 红帽   磁盘管理~~~~RAID5+LVM
  12. duet二重奏hp_二重奏Duet Game pc版|二重奏电脑版下载_v1.7_9号软件下载
  13. python图片裁剪
  14. android ibeacon sdk,智慧通行SDK
  15. Java中关于子类重写父类方法的坑
  16. tiptop 编译运行_CPU 利用率背后的真相,只有 1% 人知道
  17. 大学专业有C语言专业吗,大学里哪些专业开设C语言、数电、模电、单片机、嵌入式等课程?...
  18. 联想拯救者 R720-15IKBN 加装固态以及重装Windows 10系统
  19. 电视信号中的一些基本概念 (转自驱动之家)
  20. Ubuntu之[福昕pdf安装与卸载]

热门文章

  1. Flash Builder 4快速入门----学习笔记
  2. 拖放操作和文件复制小功能
  3. Forefront基本知识介绍
  4. 07年了,新的一年又开始了
  5. 欧洲、加拿大、澳大利亚新增2.1万个点可购买比特币现金
  6. BCH的压力测试其实已经开始了
  7. 确认过眼神(*╹▽╹*),这就是大家想要的BCH
  8. bind9.8 视图和日志功能
  9. Mybatis操作主体流程
  10. nyoj 234 吃土豆