我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的http请求就是post请求和get请求

那么引出一个最常见的问题——Q:post请求和get请求有什么区别?

A:
从语义上我们可以这么区别:
(1)从功能上,我们一般使用get请求向服务器获取数据,用post请求发送数据。
(2)从携带参数上,get请求在url后(即请求头中),以?(问好)分隔,以字符串拼接的方式将参数传入;post请求是在请求体中。
(3)从参数大小上,get请求因以url拼接传入,受浏览器对url大小限制,请求参数大小就有限制;post请求则无大小限制。
(4)从安全性上,get请求携带参数以明文暴露在url地址中,不够安全;post请求参数在请求体中,相对安全。(强调“相对”:因为安全性是从多方面考虑的,不是就用个post请求就安全了)
(5)从缓存上,get请求浏览器会主动缓存;post请求并不会。
(6)在浏览器回退时,get请求是不会再次发送请求,post请求会再次提交请求。
 
但是get请求和post请求, 本质上来说并无区别,底层实现都是基于TCP/IP协议。
我们是完全可以用get请求时参数放在body中,post请求参数是url拼接,但是这样的做法是需要多方面综合考量是否合适的。
所以在一般情况下,我们可以选择遵循语义,get请求获取数据,post请求发送数据。在我不多的经验经历下,都是在遵循这一使用情况。
补充:
有看到博客说道,get请求发一次tcp包,post请求发两次tcp包。
get请求浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
post请求可能发两次包的情况:一次header,服务器响应 100  continue,再发送data,等待服务器响应200 ok 返回数据。
排错:
  1.post请求也可能是一次发送tcp包,看了很多博客,也有不少博主有论证,post请求也可能是发一次tcp包的。
    且这种情况不仅仅只有火狐浏览器存在,有看到博客有说的其他情况,但没有记下,没有收藏,忘了具体的,欢迎补充或反驳。
  2.不存在服务器响应的说法:body中的data紧随着header发送,不会等待。(参考自:https://zhuanlan.zhihu.com/p/25028045)
 
Q:跨域post请求会发送两次?
A:我的答案是不会——会发送两次请求,但不会发送两次post请求。
所谓的post请求发送两次,其实是一次发送options请求,用于判断是否安全,是否允许跨域的;另一次就是真正的post请求。
且不是post请求就会出现这种多发一次options请求的情况,而是复杂请求在跨域时会出现这类情况。
复杂请求:非简单请求。
所以这里引出简单请求的需满足的三个条件:
1.请求方式只能是:GET、POST、HEAD
2.HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID
3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
需要三个条件都满足,才是简单请求,否则是复杂请求。
例如:设置 Content-type的值为application/json,获取的是json数据,那么是复杂请求,因此会提前发送一个options请求,以检测请求是否安全可靠,是否允许跨域,拒绝则停止post请求,接受则继续发送post请求。
 
Q:除了get、post请求,你还知道什么?
A:
OPTIONS 预检测
HEAD  类GET请求,但只获取元信息
PUT  更新
DELETE  删除
TRACE   回显服务器收到的请求,主要用于测试或诊断。
CONNECT  HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
 
本文以本人以前的笔记为基础,然后进行修改发出,部分参考博客找不到了,若侵私聊必会注明出处。
 

Http请求的三个常见问题的更多相关文章

  1. php发送post请求的三种方法示例

    本文分享下php发送post请求的三种方法与示例代码,分别使用curl.file_get_content.fsocket来实现post提交数据,大家做个参考. php发送post请求的三种方法,分别使 ...

  2. 【MySQL】锁——查看当前数据库锁请求的三种方法 20

    MySQL提供了查看当前数据库锁请求的三种方法:1. show  full  processlist命令  观察state和info列 2. show engine  innodb status\G ...

  3. 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧

    原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...

  4. 亿级PV请求的三种负载均衡技术

    在互联网+不断渗透到生活中的今天,各种各样的网络服务存在在我们身边,他们的访问流量也是大得惊人.一个大型网站(百万PV以上)想要正常访问,单单靠一台服务器是不可能提供稳定服务的.这时候就需要用负载均衡 ...

  5. java实现HTTP请求的三种方式

    目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...

  6. 亿级PV请求的三种负载均衡技术(转)

    http://www.360doc.com/content/17/1126/23/50145453_707419125.shtml       目录 DNS轮询 LVS负载均衡 DR模式 NAT模式 ...

  7. 【转载】java实现HTTP请求的三种方式

    目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...

  8. SpringBoot:CORS处理跨域请求的三种方式

    一.跨域背景 1.1 何为跨域? Url的一般格式: 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 示例: https://www.dustyblog.cn:8080/say/Hel ...

  9. 使用jmeter发送put请求的三种方式

    之前在前公司使用jmeter调试接口时,由于都是get和post请求,所以一直是顺风顺水的,毫无阻拦在短时间内调试完所有接口. 但是呢,在换到新公司后,发现接口请求是多式多样的,get.post必须有 ...

随机推荐

  1. 查看 __class__属性

    查看complex的__class__属性 a = 5+2j print(a.__class__) print(a.__class__.__class__) ''' <class 'comple ...

  2. Blob分析之Board_Segmentation_Uncalib

    * ************************************************************************************************** ...

  3. luogu P5325 Min_25筛

    LINK:Min_25筛 新版感觉有点鬼畜 而且旧版的也够用了至少. 这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的. (误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几 ...

  4. 浅谈二分图的最大匹配和二分图的KM算法

    二分图还可以,但是我不太精通.我感觉这是一个很烦的问题但是学网络流不得不学它.硬啃吧. 人比较蠢,所以思考几天才有如下理解.希望能说服我或者说服你. 二分图的判定不再赘述一个图是可被划分成一个二分图当 ...

  5. rabbitMQ安装问题记录

    参考链接: rabbitmq国内镜像地址:https://www.newbe.pro/Mirrors/Mirrors-RabbitMQ/ https://www.zhihu.com/question/ ...

  6. 利用mvc模式,实现用户的注册

    实现功能:利用mvc模式,实现用户的登陆注册功能 1.程序的框架结构 2个包,bean,以及servlet 3个jsp页面,注册页面,注册成功页面,注册失败页面 mysql驱动 2.编程思想 通过js ...

  7. Xcode11更改启动页设置方法

    新开了个项目,发现之前的启动页怎么也调不好,后来发现配置里边少了一行,所以整理一下,我使用的xcode版本是11. 以前的时候是在这2个中间,还有一行,通过下边2项来配置,现在更改了,附上新的教程.如 ...

  8. python6.2类的封装

    class Card(object): def __init__(self,num,pwd,ban): self.num=num#卡号 self.pwd=pwd#密码 self.__ban=ban#余 ...

  9. JAVA的基本程序设计结构(下)

    字符串 Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做 String. String e=""; //an empty String String ...

  10. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...