GET和POST请求区别

摘要:
对于http协议get和POST方法之间的差异,我们可以得到一致的答案。今天,让我们来填补面试中可能遇到的一个空缺。

关于http协议GET和POST方法的区别我们可以从各处得到比较一致的答案,今天我们来填一个面试中可能碰到的一个坑。

当面试官问你“你觉得GET和POST有什么区别"时,我们可能会想到以下几点(来源于网络):

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • GET请求在URL中传送的参数是有长度限制的,而POST么有。

以上答案除了最后2条基本没什么问题,我们现在测试一下到底什么情况。

在HTTP协议中并没有明确论述不同的请求方法使用的传送数据方式(url,body)不同,所以我们假设没有这种区别。

我们实现一个的socket server 端程序进行测试

package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	l, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatalln("err:", err)
	}
	defer l.Close()

	for {
		c, err := l.Accept()
		if err != nil {
			log.Fatalln("err:", err)
		}
		go process(c)

	}
}

func process(c net.Conn) {
	defer func() {
		c.Close()
		if err := recover(); err != nil {
			log.Println("process error:", err)
		}
	}()
	rH := `HTTP/1.1 200 OK
Content-Type:"application/json"`
	rSegmentation := "

"
	rB := `{"data":"success"}`
	resp := rH + rSegmentation + rB

	bs := make([]byte, 1024)
	// 读请求
	n, _ := c.Read(bs)
	fmt.Println(string(bs[:n]))
	// 响应
	c.Write([]byte(resp))
}

GET方法通过url传递数据如下 

GET和POST请求区别第1张

server接收到的http请求

GET和POST请求区别第2张

GET方法通过body传递数据如下

GET和POST请求区别第3张

server接收到的请求

GET和POST请求区别第4张

 POST方法通过url传递数据

GET和POST请求区别第5张

server接收到的请求

 GET和POST请求区别第6张

 POST方法通过body传递数据

 GET和POST请求区别第7张

server接收到的请求

 GET和POST请求区别第8张

上述四种测试case均成功,所以“GET参数通过URL传递,POST放在Request body中”和“GET请求在URL中传送的参数是有长度限制的,而POST么有”是错误的。具体来说:

  • 无论POST还是GET方法,传递数据(参数)既可通过URL也可以通过body
  • POST或者GET方法如果通过body传递数据(参数)是没有长度限制的
  • POST或者GET方法通过URL传递数据理论上也没有长度限制(因为url存在于http协议的header部分,而http header并没有长度限制)
  • 通常所说的参数数据限制是指浏览器或者werbserver会的一种设定,假如自己实现client和server完全能做到不限制长度

所以从协议角度来看GET和POST本质上并没有区别.

免责声明:文章转载自《GET和POST请求区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇何为优秀的前端?RobotFramework自动化测试框架-移动手机自动化测试Open Application关键字的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

总结前端面试过程中最容易出现的问题

前言 之前在兴安得力的时候,我也出过前端的面试题。那么前端人员在外面面试的时候,一般技术人员都会考察我们那些地方呢?我在这里不妨总结一下!(PS:有点小邪恶,这个公开之后,对于面试者来说是方便了。但是,假如你是公司技术人员,是面试官,您不妨修改一下题目,变通一下!) javascript常见题目 一、您对js的原型是如何理解的?您对js的继承是如何理解的?...

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input 对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。 “php://input allows you to read raw POST data. It...

Liferay7开发体系简介

参考:https://www.cnblogs.com/starcrm/p/6022502.html  Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组件,编译后是war包,是页面的组成元素,可以把它...

Python3调用企业微信用于告警

代码实现请见文末 前段时间利用py爬虫抓取一些网页信息,然后通过wxpy发送到微信群,以用作日常告警,感觉还是很方便。 但好景不长,我的小号微信被腾讯封了(很常见咯), 显示无法登录网页版微信,至今已经有半个多月了。 怎么办,已经体验过微信告警的方便后,无法回归原始人工查看了。思来想去,决定探(bai)索(du)Python调用微信企业号试试看; 一、申...

http请求post,返回excel文件,并接收

1.post的方法里要加responseType: 'arraybuffer'参数,不然下载的excel会乱码 2.使用{type: "application/vnd.ms-excel"}的写法,可以保存为xls格式的excel文件(兼容老版本)。而使用“application/vnd.openxmlformats-officedocument.sprea...

shiro细节、默认的过滤器、匹配模式和顺序

部分细节 [urls] 部分的配置,其格式是:“url=拦截器[参数],拦截器[参数]”; 如果当前请求的url匹配[urls] 部分的某个url模式,将会执行其配置的拦截器。 anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问) authc(authentication)拦截器表示需要身份认证通过后才能访问 shiro中默认的过滤...