简单总结Get与Post的区别
工作当中经常遇到这两种类型的接口,也会被问到这两种类型的区别,这里简单总结一下算是一个简单的回忆吧。
GET和POST是http协议的两种发送请求的方法。因为http的底层是TCP/IP,所以GET和POST的底层也是TCP/IP,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。从这点看它们有是有一些相同点的。
不同点:
1.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
2.GET在浏览器回退时是无害的,而POST会再次提交请求。
get会将请求参数放在请求的url中,回退操作实际上浏览器会从之前的缓存中拿结果;post每次调用都会创建新的资源。.另外在method的定义上,get是幂等的,执行多少遍不影响最终存储的结果。而post每次调用都会创建新的资源。Get put delete 都是等幂的,post请求两次得到两个不同的url,服务器创建了两份不同的资源,所以post不是等幂的。(等幂是说一次或多次请求资源状态不变)
3.GET请求会被浏览器主动cache,而POST不会。
HTTP缓存的基本目的就是使应用执行的更快,更易扩展,但是HTTP缓存通常只适用于idempotent request(可以理解为查询请求,也就是不更新服务端数据的请求),这也就导致了在HTTP的世界里,一般都是对Get请求做缓存,Post请求很少有缓存。
get多用来直接获取数据,不修改数据,主要目的就是DB的search语句的感觉。用缓存(有个代理服务器的概念)的目的就是查db的速度变快。
post则是发送数据到服务器端去存储。类似db里的update delete和insert语句的感觉。更新db的意思。数据必须放在数据库,所以一般都得去访问服务器端。
4.GET只能进行url编码,POST支持多种方式编码。
url编码指的是urlEncode,POST提交数据的方式有application/x-www-form-urlencoded(浏览器form表单默认的编码方式,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码),multipart/form-data(表单上传文件时,必须让 form 的 enctype 等于这个值),application/json(告诉服务端消息主体是序列化后的 JSON 字符串),text/xml(一个文本内容,根据自己和浏览器的约定进行传输)。
5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
和缓存差不多,也是为了应用执行的更快。
6.GET请求在URL中传送的参数是有长度限制的,而POST没有。
Get请求理论上是没有长度限制的,但是为了解析的方便大多数浏览器规定大小为2k。POST一般情况下是没有限制的。
7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
URL 是 HTTP 的一个首部。既然作为一个首部,那么根据约定,一定是 ASCII 字符的。
8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
get请求参数在url中,即传送的数据是在链接里面可看到,有安全问题。
post参数不是在url里面而是在请求体中,因此安全性较get高。
9.GET请求会产生一个TCP数据包,POST请求会产生两个TCP数据包。
GET请求是把http header和data一并发出去,服务器响应200,POST请求是浏览器先发送header,服务器响应100,浏览器发送data,浏览器再响应200。所以get请求只请求一次,就可以取到数据。而post请求需要请求两次才能得到想要的数据。
简单总结Get与Post的区别的更多相关文章
- 简单区分`:before`与`::before`的区别
简单区分:before与::before的区别 :hover我们都知道,称作伪类,英文名pseudo-class,而我们此处提到的:before以及:after也是伪类,属于css2的内容,在ie8下 ...
- 简单概述 .NET Framework 各版本区别
目前已发行的版本有1.0.1.1.2.0.3.0.3.5.4.0.4.5(及4.5.1.4.5.2).4.6(及4.6.1). 1.0版本:最初的.net framework版本,作为一个独立的工具包 ...
- slf4j的简单用法以及与log4j的区别
之前在项目中用的日志记录器都是log4j的日志记录器,可是到了新公司发现都是slf4j,于是想着研究一下slf4j的用法. 注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太 ...
- 简单说throw和throws的区别
1. 区别 throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是指抛出的一个具体的异常类型. 2.分别介绍 ...
- js 简单数据类型和复杂数据类型的区别
原始数据类型: number,string,boolean,undefined, null,object 基本类型(简单类型),值类型: number,string,boolean 复杂类型(引用类型 ...
- 简单了解char和varchar的区别
一.CHAR和 VARCHAR的区别? 1.CHAR有固定的长度,VARCHAR属于可变长度的字符类型. 2.比如,写入内容到CHAR(10)里,如果内容占用的空间不够10,则会用空格字符补足. 二. ...
- ffmpeg第2篇:简单滤镜与复杂滤镜的区别
在ffmpeg的滤镜中,有简单滤镜(simple filter)和复杂滤镜(complex filter)两种. 使用简单滤镜时,用-vf选项,使用复杂滤镜时,使用-filter_complex或-l ...
- python3.X中简单错误处理,和Python2区别
1.print 1.1 Print是一个函数 在Python3中print是个函数,这意味着在使用的时候必须带上小括号,并且它是带有参数的. >>> print 'hello wor ...
- 简单理解undefine和null的区别
直接进入主题: 相同点:都表示“值的空缺” 不同点: null: 定义:一个空对象指针. 使用typeOf得到Object,相当于是一个特殊值 undefine: 定义:声明变量却未对其加以初始化的变 ...
随机推荐
- 【C++初学者自学笔记一】(把自己刚学到的东西做一下总结,如果有哪些地方不足请留言指正)
这是我写的第一个博客关于C++的一些笔记,我不会写的太深奥,因为这样很多人会看不懂(我刚开始学C语言深受其害).个人觉得C++这门语言有些类似于C语言但是有些函数的用法还是有不一样的.C语言中的头文件 ...
- Node.js之EventEmiter
参考: 1. Node.js之EventEmiter讲解 2. Node.js之events事件 3. 在线运行node.js代码 Node.js主要API使用异步事件驱动模型,异步I/O操作完成时, ...
- 集合set 1
集合只能通过set() 函数进行创建 无序,不重复 每个元素必须是可哈希的,不可变类型(不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而 ...
- 面试题之第一部分(Python基础篇) 80题
第一部分(python基础篇)80题 为什么学习Python?==*== # 1. python应用于很多领域,比如后端,前端,爬虫,机器学习(人工智能)等方面,几乎能涵盖各个开发语言的领域,同时它相 ...
- C. Maximum Median 二分
C. Maximum Median 题意: 给定一个数组,可每次可以选择一个数加1,共执行k次,问执行k次操作之后这个数组的中位数最大是多少? 题解:首先对n个数进行排序,我们只对大于中位数a[n/2 ...
- 标准模板库中的向量(vector)
//C++数据结构与算法(第4版) Adam Drozdek 著 徐丹 吴伟敏<<清华大学出版社>> 头文件:#include<vector> 向量是最简单的S ...
- AndroidQ强势来袭,国产自研系统还有未来吗?
我的小米8在重启时,屏幕上总会出现那句让人印象深刻的话--"Powered by android".事实上,几乎所有Android手机都会出现这几个单词--国产智能手机也不例外.这 ...
- English_Rhymes_Phonics_resource
English_Rhymes_Phonics_resource 1. 英语启蒙早有用吗?_英语启蒙 2. 26个英文字母背后的故事_英语启蒙 3. Phonics Song 4. 学Phonics前先 ...
- Linux centosVMware 命令 lvm、磁盘故障小案例
一.lvm命令 LVM:逻辑分区管理,可基于动态的扩展缩小硬件设备的使用空间,注意:lvm磁盘复杂,由于使用lvm,数据丢失恢复起来有一定风险.概念:pv.VG.lvpv(物理卷,有pp基本单位构成) ...
- 八: IO流,数据的读写传输
IO流概括图: IO流的分类: 按流: 输入流(InputStream和Reader):从硬盘或者别的地方读入内存 输出流(OutputStream和Writer):从内存里向硬盘或别的地方输出 按 ...