Http协议详解

0.Http协议-概念

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人[Ted Nelson](https://baike.baidu.com/item/Ted Nelson)构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。(来自于百度百科)

1.Http协议的理解

​ 平时,工作中开发的B/S 结构的应用都是基于Http协议,进行数据传输的,简单点的说,Http协议 指的是一种 数据 传输的规范,只有请求发起方 和 请求接收方 都遵循 相同的协议,两者之间才能产生数据的交互,其实这里很好理解,就好像一个人讲中文,一个人讲英文,很明显,如果两人发生对话, 对话双方是不能从 对方 语言中 获取到有 “价值” 的信息的,计算机其实道理是一样的,要传输数据,首先要保证 两台 计算机 遵循的是相同的 协议, 这里表现出计算机编程 中 规范规约 的重要性。

2.Http协议内容

http协议请求内容如下,这里是通过java socket 获取的 请求 ,通过打印输入流 里面的内容获取到的。

在这里插入图片描述

请求数据包内容 可 概括为 四部分

  1. 请求行(第一行 部分) – > 请求类型,资源路径 以及 HTTP协议版本。
  2. 请求头部 (紧接着请求行,即第一行之后的部分) --> 用来说明服务器要使用的附加信息
  3. 空行 (只有存在请求数据的时候,才能看见空行) --> 请求头部后面的空行是必须的 请求头部和数据主体之间必须有换行
  4. 请求数据(也叫主体) --> 可以添加任意的数据。这部分 的内容, 我们的url 中 的各种参数都是属于请求数据这一部分的。

3.Http协议详解

第一行 内容

GET(代表的是请求方式,常见的还有POST)

/ ( / 之后是 请求资源路径 ,如果只有 IP地址 + 端口号 这种请求代表的是,没有请求资源)

HTTP1.1 (代表的是HTTP 协议版本,这里需要注意,HTTP1.1之前是有空格的,也就是请求资源与请求协议 之间 数据的 划分 是根据 空格 进行划分的)

第二行 内容

Host:localhost:8080 (请求接收方的IP 和 端口号)

第三行 内容

Connection:keep-alive (这是client 和 server 间从 短连接演变到长连接的过程)

详解 可以 参考 https://www.cnblogs.com/jtlgb/p/8805319.html 博客

第四行 内容

Cache-Control: max-age=0 (该属性实际上是设置浏览器对数据缓存方面的内容)

详解 可以 参考 https://blog.csdn.net/ysdaniel/article/details/7969766 博客

第五行 内容

Upgrade-Insecure-Requests: 1 (如果服务端有对这一参数进行处理,就可以将响应的内容从http 协议升级成 https 协议)

详解 可以 参考 https://blog.csdn.net/theanarkh/article/details/53441342 博客

第六行 内容

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36

(C/S --> B/S 演进过程中 页面渲染的 一次 争斗,这个值其实就是服务器端,可以对该参数进行处理,识别其中的核心内容,然后 返回 相应的 渲染 效果)

这个挺有趣的 其实是对页面的渲染 详情 可以 参考 https://hexingxing.cn/user-agent-mozilla/ 博客

第七行 内容

Accept-Encoding: gzip, deflate, br (当前客户端可以接受的编码)

第八行 内容

Accept-Language: zh-CN,zh;q=0.9 (当前客户端可以支持的语言)

还有POST 请求部分以及上部分的详解 请参考

https://blog.csdn.net/chao_xun/article/details/39611087 博客

当然 jdk 已经封装好对这些东西的操作了,在Java中 会使用,了解这些东西就足够了,除非是有些底层需求, 才会考虑 自行处理这部分内容。

4.GET和POST的区别

  1. get是从服务器上获取数据而post是向服务器传送数据
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中。值和表单中相应的字段一一对应,在URL中可以看到。post是通过HTTP 的post机制,将表单中各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程
  3. 对于get方式,服务器端用requestQueryString获取变量的值。对于post方式服务器用Request.form获取提交数据
  4. get传输的数据量较小,不能大于2kb,post传输的数据量比较大,一般默认为不受限制。但是理论上,IIS4中最大量为80kb,IIS5中最大量为100kb
  5. get安全性非常低,post安全性较高。但是执行效率却比post方法好。

5. 响应数据包解析

响应数据就比较简单了,结构如下:

HTTP/1.1 200 OK
Content-Length:11

Hellow World

响应数据 也是由 四部分构成

  1. 第一部分:状态行 --> Http版本、状态码、状态消息。
  2. 第二部分:响应报头部(紧接着请求行,即第一行之后的部分) --> 用来说明服务器要使用的附加信息
  3. 第三部分:空行 --> 头部后面的空行是必须的,头部和数据主体之间必须有换行
  4. 第四部分:响应正文 --> 可以天剑任何的数据。例如上面响应正文为“Hello World”。

6.响应状态码

  1. 1XX(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码
  2. 2XX(成功) 表示成功处理了请求的状态代码。
  3. 3XX(重定向) 表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。
  4. 4XX(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。
  5. 5XX(服务器错误) 这些装填代码表示服务器尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

在开发和实际中4XX 产生,也有可能是服务端代码写错,造成的服务器找不到对应的资源,从而产生的问题。

无论上述哪种错误发生,最终都是需要开发人员解决的。

这里讲个实例,再做B2B项目的时候,web服务相关的内容,是由我开发的,还有一部分数据是从ERP系统中获取的,这时候就涉及了多台服务器间数据的交互问题,有两个需要实时交互的接口(订单接口 和 发货接口 是需要实时进行数据交互的),因此使用http协议进行 数据传输,而在正式环境上, 由于运维 将 web 服务器 的 请求 重定向为 https 请求,这时候ERP系统调用我 的web 接口的时候,就曾经出现了 这种 3XX 的问题, 还好问题不大,hold住了,主要问题就是出在协议上面,定位到了问题,解决起来,真的是秒秒钟的事情,只需要在原有代码上,将http 替换成 https 就解决了这个问题。对协议的了解还是很重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值