zoukankan      html  css  js  c++  java
  • GET和POST

    GET和POST是HTTP(超文本传输协议)最常用的两种方法
    HTTP的设计目的为了保证客户机与服务器之间的通信
    HTTP的工作方式是客户机和服务器之间的请求-应答协议
    GET-从指定资源请求数据
    POST-从指定的资源提交要被处理的数据
     
    GET方法
      
    查询字符串(名称/值对)是在GET请求的URL中发送的:/test/demo_form.asp?name1=value1&name2=value2
    有关GET请求的其他一些注释
    GET请求可被缓存
    GET请求保留在浏览器历史纪录中
    GET请求可被收藏为书签
    GET请求不应在处理敏感数据时使用
    GET请求有长度限制
    GET请求只应用于取回数据
     
    POST方法

    查询字符串(名称/值)是在POST请求的HTTP消息主体中发送的POST /test/demo_form.asp HTTP/1.1
    Host: w3schools.com
    name1=value1&name2=value2
    有关POST请求的其他一些注释
    POST请求不会被缓存
    POST请求不会保留在浏览器历史纪录中
    POST请求不能被收藏为书签
     
    GET和POST对比
    w3c引入
     
    GET、POST 请求报文上的区别

    GET 和 POST 只是 HTTP 协议中两种请求方式(异曲同工),而 HTTP 协议是基于 TCP/IP 的应用层协议,无论 GET 还是 POST,用的都是同一个传输层协议,所以在传输上,没有区别。
    报文格式上,不带参数时,最大区别就是第一行方法名不同, 仅仅是报文的几个字符不同而已,POST 方法请求报文第一行是这样的 POST /url HTTP/1.1 GET 方法请求报文第一行是这样的 GET /url HTTP/1.1

    GET方法报文
    GET /updateInfo?name=Javanx&age=25 HTTP/1.1 Host: localhost

    POST方法报文
    POST /updateInfo HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=Javanx&age=25
     
    现在我们知道了两种方法本质上是 TCP 连接,没有区别。但如果不按规范来也是可以的,可以在 URL 上写参数,然后方法使用 POST;也可以在 Body 写参数,然后方法使用 GET。当然,这需要服务端支持

    GET方法参数的写法
    在约定中,我们的参数是写在?后面,用&分割。解析报文的过程是通过获取TCP数据,用正则等工具从数据中获取Header和Body,从而提取参数。

    GET方法的长度限制
    首先声明,HTTP协议没有Body和URL的长度限制,对URL限制大多是浏览器和服务器的原因,服务器因为要处理长URL要消耗较多的资源,为了性能和安全(防止恶意构造长URL来攻击)考虑,会给URL长度加限制。
    规定:get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

    GET和POST安全性
    有人说POST比GET安全,因为数据在地址栏上不可见。
    但是从传输的角度讲,他们都是不安全的,因为HTTP在网络上是明文传输的,只要在网络节点上抓包,就能完整地获取数据报文。
    要想安全传输,就只有加密,也就是HTTPS

    POST方法会产生两个TCP数据包吗?
    有些文章中提到,post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。
    HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。
    所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式
    报文格式

    HTTP请求中请求头 Header里的 Content-Type
     
    Content-Type一般有这三种。
    application/x-www-form-urlencoded :数据被编码为名称/值对。这是标准的编码格式。
    multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
    text/plain :数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
     
    form表单的enctype属性为编码方式,常见的有两种:application/x-www-form-urlencoded、multipart/form-data。默认值是application/x-www-form-urlencoded。
    当请求方式为get时浏览器会用application/x-www-form-urlencoded的编码方式把form数据转换成一个字符串,用 ? 连接url将数据追加到url的后边。生成新的url。
    当请求方式为post浏览器会将form数据分装到http body中,如果没有type=file的控件的话,浏览器会使用默认的编码方式application/x-www-form-urlencoded进行编码,如果有type=file控件的话,将会使用multipart/form-data的编码方式进行编码。
    当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
  • 相关阅读:
    Linux 信号:signal 与 sigaction
    Linux shell(1)
    【Beta阶段】第一次scrum meeting
    【Beta阶段】计划安排
    团队作业7——Alpha冲刺之事后诸葛亮
    团队作业5——测试与发布(Alpha版本)
    【Alpha阶段汇总】成果展示与体验总结
    【Alpha阶段】第七次scrum meeting
    【Alpha阶段】第六次scrum meeting
    【Alpha阶段】第五次scrum meeting
  • 原文地址:https://www.cnblogs.com/xiangW/p/10993863.html
Copyright © 2011-2022 走看看