• Http请求的三个常见问题


    我们做的大多数项目,必不可少的需要向后台发送请求获取数据,常用的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代理服务器)。
     
    本文以本人以前的笔记为基础,然后进行修改发出,部分参考博客找不到了,若侵私聊必会注明出处。
     
  • 相关阅读:
    保存会话数据——cookie学习
    HttpServletRequest学习
    HttpServletResponse 学习
    Servlet学习
    Http协议简单学习笔记
    利用tomcat配置网站
    PHPCMS-V9 获取一级栏目、二级栏目、三级栏目
    PHP判断当前访问的是 微信、iphone、android 浏览器
    二维数组根据某个字段排序
    动物界的再生一个故事
  • 原文地址:https://www.cnblogs.com/nys013/p/13374966.html
Copyright © 2020-2023  润新知