• GET,POST — 简述


    本文主要对GET与POST基本区别进行汇总并掌握,如有错误与遗漏之处,请指出。

    文章出处:http://www.cnblogs.com/useryangtao/

    1. HTTP

    HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。

    HTTP 的工作方式是客户端与服务器之间的 "请求-响应" 协议。

    客户端可以是 Web 浏览器,服务器端可以是计算机上的某些网络应用程序。

    通常情况下,由浏览器向服务器发起 HTTP 请求,服务器向浏览器返回响应。

    响应包含了请求的状态信息以及可能被请求的内容。

    2. 请求方式

    HTTP方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 。

    其中两种常见的 HTTP 请求就是: GETPOST

    GET是从服务器上获取数据,POST则是向指定的资源提交要被处理的数据

    3. 格式

    请求报文的格式:

    <request line>

    <headers>

    <blank line>

    <request-body>

     

    GET请求数据按照查询字符串(名称/值对)方式,放置在 HTTP请求协议头(headers) 中,也就是URL之后;

     

    POST提交的数据则放在 实体的主体(request-body) 中。

    4. 缓存,书签,历史记录,默认method

    缓存 : GET会被缓存,POST不能。

    书签 : GET可收藏为书签,POST不可收藏为书签

    历史记录 : GET请求的URL,参数会被浏览器保留在历史中,POST参数不会。

    默认method : 在from提交的时候,如果不指定Method,则默认为GET请求。

    5. 响应速度
    GET请求是可以被客户端缓存的。会比POST高效。 AJAX环境中GET响应快速,POST需要先发送HTTP头部(headers) 再发送报文 实体的主体(request-body)中的数据。
    6. 类型限制

    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)中,有 4 种提交数据的方式(设置content-type):

     

    1.application/x-www-form-urlencoded

    提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码 Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」

     

    2.multipart/form-data

    表单上传文件时,必须让 form 的 enctyped 等于这个值

    这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

     

    3.application/json

    告诉服务端消息主体是序列化后的 JSON 字符串

    POST http://www.example.com HTTP/1.1

    Content-Type: application/json;charset=utf-8

    {"id":1,"sub":["a","b","c"]}

     

    4.text/xml

    它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。

    JavaScript 中,也有现成的库支持以这种方式进行数据交互

    XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

    7. 大小限制

    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没有关系。

    8. 实际中 — POST比GET「相对安全」

    GET所发送的数据是 URL 的一部分, 有时候会直接反应在浏览器的地址栏,

    现在的浏览器大多会记住曾经输入过的URL(在发送密码或敏感信息时绝不要使用 GET !)。

    试想如果你曾经在别人电脑上填过一个很私密的表单,那么你的这份记录很可能被连没什么电脑常识的人都一览无遗。

    但是被抓包之后的POST请求和GET请求是一样裸露的,所以这里是相对的。

    9. 语义上 — GET比POST「相对安全」

    说 POST 比 GET 安全 也不完全对的。 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

    在语义上(restful视角): GET的是获取指定URL上的资源,是读操作。

    重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,

    在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。

    因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来。

    POST的语义是修改变服务器上的资源的请求,所以是不安全的, 每次提交的POST,代码都会认为这个操作会修改资源的状态,

    于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。





  • 相关阅读:
    c++的输入流基础知识
    用英文加优先级来解读C的声明
    django 用imagefiled访问图片
    关于Django中的表单验证
    c#语言的一些复习
    IIS发布的网站用localhost可以访问,改成IP就无法访问的解决方案 .
    首次关于IIS配置遇到的一些问题
    常见dos操作
    vs2012中对于entity framework的使用
    几个知识点
  • 原文地址:https://www.cnblogs.com/useryangtao/p/5339688.html
Copyright © 2020-2023  润新知