我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的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. EF Code First数据库模型及属性约束

    1.今日完成任务 数据库实体的创建 实体属性约束的添加 实体之间关系的添加 2.核心代码 EF模型 属性约束及实体之间的关系 使用FlutAPI对模型进行修正 3.遇到的问题及解决方案 最主要的是联合 ...

  2. number类型转date类型

    遇到用数字记录日期时,进行查询转换. create or replace function num_to_date(s in number) return dateisbegin return to_ ...

  3. linux的服务管理(centos6和Centos7)和网络管理(网卡配置),计划服务cron

    服务和网络 管理 init  ifcfg ens33 1.服务: Linux系统中提供的功能,统称为服务,如:at服务.cron服务.web服务.FTP服务.sshd服务等. 服务是由已经在运行的进程 ...

  4. win10下visual studio code安装及mingw C/C++编译器配置,launch.json和task.json文件的配置

    快一年了,我竟然还有脸回来..... 过去一年,由于毕设.找工作的原因,发生太多变故,所以一直没更(最主要的原因还是毅力不够...),至于发生了什么事,以后想说的时候再更吧..依然是小白,下面说正事. ...

  5. JavaScript动画实例:圆点的衍生

    考虑如下的曲线方程: R=S*sqrt(n) α=n*θ X=R*SIN(α) Y=R*COS(α) 其中,S和θ可指定某一个定值.对n循环取0~999共1000个值,对于每个n,按照给定的坐标方程, ...

  6. 解决Xshell 工具连接不上VirtualBox虚拟机

    初次尝试用VirtualBox安装Linux虚拟机,却遇到了一些问题,特地记录于此,方便后面查阅! 首先简易记录下安装Linux虚拟机过程: 大致经过如下步骤:新建虚拟电脑,加载Linux版本镜像安装 ...

  7. 响应式Web设计与CSS(上)

    1.一个例子 响应式Web设计最核心的一点,就是可以适配不同视口大小的流式布局. 1.1 简单上手 <div class="row"> <header class ...

  8. Flask 框架小记

    Flask 框架小记 Flask 实例 创建示例的代码 from flask import Flask # __name__ 是模块名, 用于反射导入模块 app = Flask(__name__, ...

  9. 10、Java 数组的定义和使用

    1.数组的定义 首先举一个小例自:如果你现在需要定义100个int类型的变量,那么按照前俩节的做法为: int a = 1, b=2 , c=3.......; 可以发现我们的代码特别的冗余,而且不美 ...

  10. Java环境变量,jdk和jre的区别,面向对象语言编程

    什么是java? java是一门面向对象的编程语言,包括java SE, java ME, Java EE . 广泛使用的是作为后端语言的Java EE开发, 面向对象和面向过程? java,C++ ...