Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • HTTP

    • Get 与 Post
      • 语义上的区别
      • 格式上的区别
      • 幂等性区别
    • 状态码&字段
    • 输入URL到返回页面全过程
    • HTTP
    • HTTP演进
    • HTTPS
    • WebSocket
    • RPC
    • 粘包问题
    • Java中的网络请求
    • 请求报文与响应报文
    • HTTP如何保存用户状态
    • 长连接与短连接
    • SSL TLS
  • TCP

  • UDP

  • IP

  • 网络安全

  • 计算机网络
  • HTTP
Nreal
2023-11-20
目录

Get 与 Post

# 语义上的区别

根据RFC规范:

  • GET 的语义是从服务器获取指定的资源;
  • POST 的语义是根据请求负荷(报文body)对指定的资源做出处理;

# 格式上的区别

  • GET 请求的参数放在 URL 中,且 URL 长度受到浏览器和服务器的限制;

    GET /signin?next=%2F HTTP/2\r\n
    Host: www.zhihu.com\r\n
    User-Agent: Mozilla/5.0\r\n
    Accept: */*\r\n
    Accept-Language: zh-CN\r\n
    Accept-Encoding: gzip, deflate\r\n
    Connection: keep-alive\r\n
    Upgrade-Insecure-Requests: 1\r\n
    Cache-Control: max-age=0\r\n
    TE: trailers\r\n
    \r\n
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • POST 请求的参数放在 请求体 中,可以有多种编码格式,如application/x-www-form-urlencoded,multipart/form-data,application/json等;且请求的 body 大小没有限制;

    POST /login HTTP/1.1\r\n
    Host: 127.0.0.1:8888\r\n
    User-Agent: Mozilla/5.0\r\n
    Accept: */*\r\n
    Accept-Language: zh-CN\r\n
    Accept-Encoding: gzip, deflate\r\n
    Content-Type: application/x-www-form-urlencoded\r\n
    Content-Length: 29\r\n
    Connection: keep-alive\r\n
    \r\n
    username=root&password=123456
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    POST请求体的文件中如果出现 \r\n 会不会导致请求体解析结束?

    不会,只有请求头最后一个\r\n的空行作为结束的标志,且请求头中的Content-Length有请求体字段长度,会把所有长度范围内的字段都作为请求体部分;

# 幂等性区别

  • GET 请求是幂等的,即多次重复执行不会改变资源的状态,所以 GET 请求的数据可以被缓存;

  • POST 请求是不幂等的,因为是「新增或提交数据」的操作,会修改服务器上的资源,所以也是不安全的;

    如果GET和POST都用 HTTP 请求,都是不安全的,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据;

状态码&字段

状态码&字段→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式