我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的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. pandas_一维数组与常用操作

    # 一维数组与常用操作 import pandas as pd # 设置输出结果列对齐 pd.set_option('display.unicode.ambiguous_as_wide',True) ...

  2. Python 访问字符串中的值

    Python 访问字符串中的值 Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用.高佣联盟 www.cgewang.com Python 访问子字符串,可以使用方括号来 ...

  3. PHP linkinfo() 函数

    定义和用法 linkinfo() 函数返回有关一个硬连接的信息. 该函数返回设备 ID,如果失败则返回 FALSE. 语法 linkinfo(path) 参数 描述 path 必需.规定要检查的路径. ...

  4. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  5. 7.1 NOI模拟赛 计数问题 dp

    还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数 ...

  6. CF453A Little Pony and Expected Maximum 期望dp

    LINK:Little Pony and Expected Maximum 容易设出状态f[i][j]表示前i次最大值为j的概率. 转移很显然 不过复杂度很高. 考虑优化.考虑直接求出最大值为j的概率 ...

  7. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/exceptions/YarnException

    这个是Flink 1.11.1  使用yarn-session 出现的错误:原因是在Flink1.11 之后不再提供flink-shaded-hadoop-*” jars 需要在yarn-sessio ...

  8. 11-Arrays工具类的使用

    1.理解:① 定义在java.util包下.② Arrays:提供了很多操作数组的方法. 2.使用: //1.boolean equals(int[] a,int[] b):判断两个数组是否相等. i ...

  9. ios 生成字母加数字的随机数

    文章来自:http://blog.csdn.net/baidu_25743639/article/details/73801700 近期项目第三方登录之后默认创建账号和密码,就用随机数生产,这里只需要 ...

  10. one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [3, 1280, 28, 28]], which is output 0 of LeakyReluBackward1, is at version 2;

    RuntimeError: one of the variables needed for gradient computation has been modified by an inplace o ...