GET,POST
HTTP
HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。
HTTP 的工作方式是客户端与服务器之间的 “请求-响应” 协议。
客户端可以是 Web 浏览器,服务器端可以是计算机上的某些网络应用程序。
通常情况下,由浏览器向服务器发起 HTTP 请求,服务器向浏览器返回响应。响应包含了请求的状态信息以及可能被请求的内容。- 请求方式
HTTP方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT ,
其中两种常见的 HTTP 请求就是:GET 和 POST。
GET是从服务器上获取数据,POST则是向指定的资源提交要被处理的数据
3.格式
请求报文的格式:
<request line>
<headers>
<blank line>
<request-body>
GET请求数据按照查询字符串(名称/值对)方式,放置在HTTP请求协议头(headers)中,也就是URL之后;
而POST提交的数据则放在实体的主体(request-body)中。
缓存,书签,历史记录,默认method
4.1 缓存: GET会被缓存,POST不能。
4.2 书签: GET可收藏为书签,POST不可收藏为书签
4.3 历史记录: GET请求的URL,参数会被浏览器保留在历史中,POST参数不会。
4.4 默认请求:在from提交的时候,如果不指定Method,则默认为get请求。响应速度
GET请求是可以被客户端缓存的。会比POST高效。
AJAX环境中GET响应快速,POST需要先发送HTTP头部(headers) 再发送报文实体的主体(request-body)中的数据。- 类型限制
6.1 GET限制数据集的值必须为ASCII字符;
GET提交的数据将会附加在url之后,以?分开与url分开。
1.以 ? 来分隔URL和数据;
2.以& 来分隔参数;
3.如果数据是英文或数字,原样发送;
4.如果数据是中文或其它字符,则进行BASE64编码
5.GET将数据的按照variable=value的形式,添加到URL后面;
如:http://www.abc.com/?username=yt&id=123
6.2 POST没有限制,允许二进制数据。
POST是将数据放在请求的数据体(request-body)中,按照查询字符串(名称/值对)相对应的方式,传递到所指向URL;
- 大小限制
7.1.GET方式提交的数据最多只能是1024字节,POST支持较大数据传输
7.2HTTP协议对GET和POST都没有对长度的限制
RFC 2616 中明确对 uri 的长度并没有限制。
不过虽然在RFC中并没有对uri的长度进行限制,但是各大浏览器厂家实现上限制了URL的长度。
IE对URL长度的限制是2083字节(2K+35)
而对于URL长度上的限制,有两方面的原因造成 ( 安全考虑 ):
浏览器:据说早期的浏览器会对URL长度做限制。IE对URL长度会限制在2083个字符内,Chrome会崩溃。
服务器:URL长了,对服务器处理也是一种负担。
原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,
并不停地访问你的服务器。服务器的最大并发数显然会下降。
另一种攻击方式是:把告诉服务器Content-Length是一个很大的数,
然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。
哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。
有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。
但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。
- 实际中 — POST比GET「相对安全」
GET所发送的数据是 URL 的一部分,
有时候会直接反应在浏览器的地址栏,
现在的浏览器大多会记住曾经输入过的URL(在发送密码或敏感信息时绝不要使用 GET !)。
试想如果你曾经在别人电脑上填过一个很私密的表单,那么你的这份记录很可能被连没什么电脑常识的人都一览无遗。
但是被抓包之后的POST请求和GET请求是一样裸露的,所以这里是相对的。
- 语义上 — GET比POST「相对安全」
说 POST 比 GET 安全 也不完全对的。
根据HTTP规范,POST表示可能修改变服务器上的资源的请求。
在语义上(restful视角):
GET的是获取指定URL上的资源,是读操作。
重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,
在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。
因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来。
POST的语义是修改变服务器上的资源的请求,所以是不安全的,
每次提交的POST,代码都会认为这个操作会修改资源的状态,
于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。
GET,POST的更多相关文章
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- MPlayer
名称 mplayer − 电影播放器 mencoder − 电影编解码器 概要 mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...
- python 爬取腾讯微博并生成词云
本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...
- 面经 cisco
1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...
- linux驱动(续)
网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,psel ...
- HttpServletRequest对象(一)
javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- 先说IEnumerable,我们每天用的foreach你真的懂它吗?
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- Angular2入门系列教程3-多个组件,主从关系
上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...
随机推荐
- C# HttpWebRequest 绝技 【转】
原文地址:http://www.sufeinet.com/thread-6-1-1.html 在线测试工具http://www.sufeinet.com/thread-3690-1-1.html c# ...
- DB2中查询前十数据的sql
select * from A fetch first 10 rows only
- ElasticSearch 监控单个节点详解
1.介绍 集群健康 就像是光谱的一端——对集群的所有信息进行高度概述. 而 节点统计值 API 则是在另一端.它提供一个让人眼花缭乱的统计数据的数组,包含集群的每一个节点统计值. 节点统计值 提供的统 ...
- 从头认识java-14.4 Java提供的数组的有用功能(2)
接着上一章节,我们继续介绍Java提供的数组的有用功能. 3.元素的对照Comparator package com.ray.ch14; import java.util.Arrays; import ...
- 用new和delete运算符进行动态分配和撤销存储空间
測试描写叙述:暂时开辟一个存储空间以存放一个结构体数据 #include <iostream> #include <string> using namespace std; s ...
- thrift.transport.TTransport.TTransportException: Could not start SASL: Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found
thrift.transport.TTransport.TTransportException: Could not start SASL: Error in sasl_client_start (- ...
- oracle学习小知识点总结
登陆数据库:sqlplus "/as sysdba" window身份验证,不需要用户名和密码. 查看数据库状态: select status from v$instance(v$ ...
- redis批量删除多个keys
Redis的官网redis.io,大家可以查看很多命令的使用方法 说明:删除单个key比较简单,直接使用命令del xxxkey,批量删除多个keys可利用如下命令: 假设:redis的安装目录如下: ...
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- 转: WebView载入一个网页 但是退出对应的activity时, 声音、视频无法停止播放 解决方案(未验证)
1. webview.onPause 2. webview独立进程,杀进程3.小场景可以不用这么复杂有个技巧就是在activity退出的时候加载一个空白页面,就能解决