关于GET POST
先说相同点,只有了解了相同点之后才能理解为什么会发生混淆。两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是var_1=value_1&var_2=value_2&....get 和 post 区别如字面,一个是get(获取),一个是post(发送)。get用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以提供查询参数(query)以获得相应内容。post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理之后再存储)。
get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,所以还是老老实实用来做检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),因此对于大的数据(一般来说需要存储的数据可能会比较大,比2048字节大)的传递有天然的优势,谁让它是 nature born post 呢
get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,可以在地址栏随时修改数据以变更需要获取的内容,比如直接修改分页的编号就跳到另外一个分页了(当然也可能是 404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多,url的修改只要点击地址栏输入字符就可以了),除非是专门跑来编辑数据的。
HTTP协议与get/post请求方式
1、HTTP
hypertext transfer protocol 超文本传输控制协议。
定义了浏览器与web服务器之间数据传输的方式与数据格式(W3C定义)。
2、数据传输的方式
(1)浏览器请求建立连接。
(2)浏览器向服务器发送请求。
(3)服务器处理请求
(4)服务器发送响应,然后立即关闭连接。
注:如果浏览器想向服务器再发送一个请求,需要重新请求建立连接。
3、数据格式
(1)请求数据包
1)请求行
请求方式(get/post) 请求资源的路径 HTTP协议版本(1.0/1.1)
2)若干消息头
浏览器与服务器之间通讯的一些约定。
比如,浏览器可以告诉服务器浏览器名称、版本等信息。
3)实体内容
如果是post方式,请求数据会存放到实体内容里面。
如果是get方式,会放到请求行中的请求资源路径之后。
(2)响应数据包
1)状态行
协议版本号状态码状态码的描述
状态码:
200 正常
300 请求的资源可在多处得到
400 错误请求
401 未授权
403 禁止访问
404 找不到资源
500 系统内部错误
…
2)若干消息头
比如服务器可以向浏览器发送cookie。
3)实体内容
服务器处理完之后的结果,一般要求浏览器显示的数据。
4、get/post请求方式
(1)get方式:
1)表单默认提交的方式
2)直接在浏览器地址栏输入地址
3)通过链接访问某个地址
(2)get方式的特点:
1)在地址栏会显示请求数据;
2)请求数据会放到请求资源路径后面;
3)get方式一般用于向服务器获取资源;
4)浏览器有可能缓存get方式访问过的数据。
(3)post方式:
设置表单method="post"。
(4)post方式的特点:
1)数据不会在地址栏显示;
2)数据会存放到实体内容里;
3)post方式一般用于向服务器提交数据;
(5)优缺点比较
get方式 |
post方式 |
提交的数据量有限制 (因为只能存放到请求行之后) |
数据量大 (因为存放在实体内容里面) |
不安全 (在浏览器地址栏能看到数据) |
相对安全 (实体内容中的数据仍没有加密,可借助工具查看) |
随机推荐
- OSG绘制金字塔geode+动态纹理坐标
osg::Node* createPyramidModel() { // create the root node which will hold the model. osg::Group* roo ...
- Core Location和MapKit的一些简单使用
Core Location 1. 基本对象是CLLocation,有属性coordinate, altitude, horizontal/vertical Accuracy, timestamp, ...
- List转换为数组Array的方法
List<String> list = new ArrayList<String>(); list.add("str1"); list.add(" ...
- synchronized同步方法
“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问的时候产生,产生的后果是脏读,也就是取到的数据是被更改过的.而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象 ...
- vscode中的vue文件中emmet进行tab键不起作用
文件--首选项---设置 搜索: emmet.includeLanguages在右边修改 "emmet.triggerExpansionOnTab": true, "em ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- WCF学习 (三)深入认识WCF契约
什么是契约? 从SOA概念上讲,契约属于服务公开接口的一部分.一个服务契约,定义了服务端公开的服务方法,使用传输协议,可访问地址,传输的消息格式等内容.换句话说:契约描述了该服务的功能和作用,它告诉S ...
- Mac - 关闭隐藏文件显示(Terminal)
打开终端Terminal,输入:defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write ...
- EDT改成CST
功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在最后加 ...
- javascript飞机大战-----003创建英雄机
/* 英雄机:因为英雄机只有一辆所以不需要用构造函数 */ var Hero = { //初始图片 self:null, //初始left left:0, //初始top top:0, //生命值 l ...