我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的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. 学习JavaScript数据结构与算法 2/15

    第一章 JavaScript简介 js不同于C/C++,C#,JAVA,不是强类型语言. 通常,代码质量可以用全局变量和函数的数量来考量(数量越多越糟).因此,尽可能避免使用全局变量. JS数据类型 ...

  2. PHP pos() 函数

    实例 输出数组中的当前元素的值: <?php$people = array("Peter", "Joe", "Glenn", &quo ...

  3. PHP preg_match_all() 函数

    preg_match_all 函数用于执行一个全局正则表达式匹配.高佣联盟 www.cgewang.com 语法 int preg_match_all ( string $pattern , stri ...

  4. PHP bin2hex() 函数

    实例 把 "Hello World!" 转换为十六进制值: <?php 高佣联盟 www.cgewang.com$str = bin2hex("Hello Worl ...

  5. 毒瘤dp 学校食堂

    这道dp题 可谓是比较难了,我想了2h 总是觉得自己设的状态没有包涵全部的状态空间 一直想不出来状态 最后败北. 正解是这样的 我们肯定是有一维i的表示 到了i 这个人吃饭了 但是在i吃饭之前后面的7 ...

  6. luogu P4884 多少个1?

    LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...

  7. PHP代码混淆与加密——php screw plus

    php是一个开源的.广受欢迎的语言,php应用常常是以代码明文的发式发布,但是有时候对于发布的代码我们想要进行保护,需要对php代码进行混淆与加密,让增加破解者的逆向难度,从而达到保护自己成果的目的. ...

  8. 关于innerHtml= 与 html() 区别

    今天遇到的问题:如果写入的html 有<script>,必须用JQuery 的 html() 才能识别: 使用innerHtml 无法识别<script> 原因机制:待查询

  9. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  10. 求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法

    1.题目描述     给定数组arr,返回arr的最长递增子序列. 2.举例     arr={2,1,5,3,6,4,8,9,7},返回的最长递增子序列为{1,3,4,8,9}. 3.解答      ...