Advertisement

HTTP 协议内容的介绍与应用

阅读量:

HTTP简介

HTTP 即为超文本传输协议(Hyper Text Transfer Protocol),属于应用层协议的一种,在实际应用中非常普遍。它不仅用于浏览器输入一个网站地址即可打开网页的过程,在日常使用中我们经常看到浏览器输入一个网站地址即可打开网页的情况;而且在数据传输方面也有重要应用:例如,在日常使用中,我们经常看到浏览器输入一个网站地址即可打开网页;此外,在数据传输方面也有重要用途:例如,在后端服务之间建立通信时也会用到该协议:例如,在数据请求和通信过程中也会用到该技术:例如,在构建Web应用程序时也会用到该技术:例如,在构建Web应用程序时也会用到该技术:例如,在构建Web应用程序时也会用到该技术:

HTTP的一些优点:

  • HTTP具有简洁明了的请求-响应架构。
  • 高效便捷:客户端发起请求时只需提供方法和路径信息即可完成操作,并且该过程无状态维持。
  • 它建立在TCP协议之上,并保障通信过程稳定可靠,在开发层面则无需关注数据传输的具体机制。
  • 作为应用层协议设计,在实际应用中能够方便地实现跨网服务传递。
  • 在基于HTTP框架下配合SSL技术可轻松构建安全可靠的HTTPS通道以保障数据传输安全。

HTTP协议内容

HTTP是由W3C和IETF两个国际组织共同推出的标准化计算协议。当前的主要版本是1.1版,在推广过程中还包括了2.0版的发展。如需进一步查阅详细内容,请参考这里。

HTTP/1.1协议(RFC 2617):https://www.git-squid.io/rfc2598.html

HTTP/2.0协议(RFC 7540): 引用来源:[https://datatracker.ietf.org/doc/html/rfc7540] 超链接指向该位置

在网络传输技术领域中,在报文细节方面的优化工作已经完成得非常出色。然而,在针对开发同学这一关注群体而言,则上述细节方面的内容与他们的实际需求关联度并不高。因此,在后续的内容介绍中,我们主要将重点放在主流的1.1版协议上。

请求响应模型

在每次网络通信过程中,必定存在发送的数据以及相应的返回信息。在HTTP协议中被称作请求(Request)与响应(Response)。当用户通过浏览器访问网站时,在Request对象中可以找到所需的网页URL地址以及相关的请求参数信息;而返回的内容则存储于Response对象中。

请求的数据结构

客户端发起一个HTTP请求数据包中包含以下要素:请求数组(request array)、头信息(header)、空白行以及正文内容四者组合而成;如下图所示展示了 typical 请求报文的基本架构

请求行

包含请求方法(Method)以及请求地址(Request-URI),它们构成了三项核心信息;例如HTTP/1.1协议中的这三个要素分别对应不同的功能定位

该请求采用GET方式访问指定URL:https://www.taobao.com(此处应为:https://www.taobao.com),该请求采用HTTP/1.1协议进行通信

请求方式

  • OPTIONS:服务器会包含支持的服务类型信息(如HTTP/1.1、HTTP/1.0等)。
    • HEAD:Web服务器会提供与GET请求相同的响应内容(如状态码、头信息),但不会传输响应体内容(可选)。
    • GET:向指定资源发起请求以获取响应内容。
    • POST:向目标资源提交表单数据或上传文件(如图片、Excel文件等)进行处理请求。
    • PUT:将最新版本的内容更新到指定位置(如更新数据库记录)。
    • DELETE:要求服务器删除指定路径中的资源(如删除数据库记录)。
    • TRACE:记录并显示服务器收到的所有客户端连接(可选)。
    • CONNECT:代理服务器将连接模式转换为管道式(仅适用于HTTP/1.1协议)。

请求地址

也就是我们常说的网络地址,其别名是统一资源定位系统(uniform resource locator;URL)。通常由以下几个组成部分构成:

<请求协议>://<用户名>:<密码>@<域名>:<端口>/<uri路径>

请求头部(Request header)介绍

header通常包括一些补充信息来辅助处理请求,并不直接作为真实数据使用。它是对请求相关信息的描述,并且偶尔还会包含cookie或token等用于鉴权的信息

举例:

请求正文(body)

代表真实数据的部分其中的数据格式通常存储于header中的content_type字段中常见的类型包括以下几种:

  • application/json : JSON数据格式
  • application/x-www-form-urlencoded :HTML形式的数据传输方式(通常用于Ajax请求)
  • multipart/form-data : 在表单上传文件时使用的格式

服务器响应消息

一个HTTP响应包含四个组成部分:状态行、消息报头(Response Header)、空白行以及响应正文内容。

状态行介绍

HTTP 状态码由三位十进制数字构成,并根据第一位数字确定其类别。响应被划分为五个类别:信息型回应(从 1 到 1 到 1 到 1 到 1 到),成功型回应(从 2 到 2到),转录(从3到3到),客户端错误(从4到4到)以及服务器错误(从5到5到)。

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常用的HTTP状态码解释请参考:https://www.runoob.com/http/http-status-codes.html

消息报头(Response Header)

对返回内容的说明性描述,一些常见的Response Header举例

应答头 说明
Allow 服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?
Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

| Refresh| 表示浏览器应每隔多少秒自动刷新文档。
除了直接刷新当前页面外,
您还可以通过设置HTTP头中的Refresh字段为5; URL=http://host/path来实现特定跳转。 需要注意的是, 此功能通常通过在HTML页面的HEAD部分设置来实现, 因为自动刷新或重定向对无法使用CGI或Servlet进行网页开发的技术人员尤为重要。 但对于采用Servlet进行开发的技术人员来说, 则可以直接配置Refresh`头参数更为便捷。

注意使用Refresh的作用是指在N秒内重新加载当前页面内容或访问指定页面,并且这种操作应被理解为在每次刷新时都必须包含一个Refresher头信息包以确保持续更新。与之不同的是不应将其误认为是每隔N秒才进行一次刷新操作。为了实现连续刷新功能必须在每次请求中包含一个Refresh头信息包;而若采用HTTP状态码中的204状态码则能够有效地阻止浏览器进行额外的请求操作从而避免不必要的重载尝试。

注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。 |

Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

响应正文(Body)

这里实际上包含了真实的请求数据。header中的Content-Type字段决定了返回数据的类型或格式。浏览器会根据这一信息来解析并处理相应的响应内容。content-type参考:https://www.runoob.com/http/http-content-type.html

与HSF、Dubbo等TCP层协议的区别对比

在软件开发中, 通常会采用应用层采用HTTP协议作为基础通信方式;同时也会采用基于TCP协议(如HSF和DUBBO)进行通信

HTTP通常被广泛应用于公网上进行数据传输;而后端服务器之间的网络通信则主要采用HSF、Dubbo等协议来实现。

这里对他们进行一下对比

HTTP HSF、Dubbo等
网络层级 应用层 传输层
数据结构 协议中规定了请求和相应的格式 每种协议各不相同
通信效率 作为标准协议冗余信息较多,通信效率相对较低 通过自定义数据结构压缩数据内容,通信效率较高
是否面向互联网 是,Web中通行的标准协议 否,面向特定场景使用
安全性 通过SSL加强 一般用于内网,也可以通过SSL等技术进行通信加密
适用场景 一般性的Web开发和互联网应用 对性能有要求的特定场景

Spring MVC中的相关注解

SpringMVC当前已成为广泛应用于Java语言环境下的常见Web开发框架。在Controller类中,我们会在声明处理哪些HTTP请求及其返回数据格式时,会采用一些特定注解来辅助实现,这些注解通常与前述提及的HTTP协议知识结合使用来进行详细说明。

请求类型

常用注解举例:

  • @RequestMapping的主要职责是将Web应用程序接收到的客户端请求与处理该请求的任务关联起来。
  • @RequestBody用于将来自HTTP客户端的body字段与响应对象关联起来。
  • @RequestHeader用于标识从HTTP头信息中提取特定的数据字段。
  • @RequestParam指定在应用程序接收的URL路径或HTTP body中查找某个特定的数据字段的位置信息。

响应类型

常用注解举例:

  • @体标签: 将controller的方法返回的对象经过适当的转换器处理并以指定格式存储在response对象的body区域中,并常用于输出JSON数据。
  • @响应头标签: 用于指定返回的数据字段。
  • @状态码标签则决定了返回的成功与否的状态。

OpenApi/Swagger

在实际项目开发中, 后端开发人员通常会向前端开发者提供接口说明文档。我们之前已经介绍过HTTP作为一种标准的网络协议, 其内容相对简单, 并且大部分功能已经在Spring MVC注解框架下实现了。是否有一种自动化的方式能够生成接口说明文档?这个问题的答案是肯定的, 确实存在这样的解决方案, 即 Swagger 技术得到了广泛的应用。 Swagger 发展到第三个版本时, 被正式命名为 OpenAPI 3.0, 因此 OpenApi 和 Swagger 可以被视作同一个概念的不同名称。

Swagger的详细介绍如下:https://swagger.io 。实际上主要用于提供以下功能:API设计模块、代码自动生成功能以及文档可视化界面等组件。本文重点讲解了开发人员常用的主要功能点。

Swagger UI

在使用过程中需要先引入相应的JAR包,并随后进行必要的参数配置。最终,在程序启动后就能够看到swagger格式的接口文档了。鉴于篇幅限制,这里不展开详细说明配置的具体步骤,请您参考附带文档中的设置指南查看最终结果的示例:

Swagger的说明注解

如果仅使用基于SpringMVC注解生成文档的话,可能会发现缺少一些接口和字段细节信息;这里介绍一些常用的Swagger注解用来为生成的文档补充必要的信息。

@Api:修饰整个类,描述Controller 的作用

@ApiOperation:描述一个类的一个方法,或者说一个接口

@ApiParam:单个参数描述

@ApiModel:用对象来接收参数

@ApiProperty:用对象接收参数时,描述对象的一个字段

HTTP数据的实际应用举例

目前关于HTTP相关的内容介绍已经基本覆盖了

以下是经过同义改写的文本

遵循前述建议的大禹平台团队;进行了针对性的功能开发;以我们的功能;为例

遵循前述建议的大禹平台团队;进行了针对性的功能开发;以我们的功能;为例

该系统支持手动录入界面或从外部数据源导入的方式生成HTTP接口定义。根据不同应用场景,该系统能够提供灵活的应用方案选择:

  • 前端接口mock: 可以在后端服务没有就绪的请情况下,以模拟返回数据的方式进行接口开发。
  • 接口执行:通过接口定义直接发起接口请求,查看接口返回数据。
  • 作为测试用例的数据源:基于接口定义,可以填写接口入参、提取出参、添加验证条件。判断是否在给定的请求数据下,接口返回了符合预期的数据。
  • 生成java定义代码:如果是页面录入的接口定义,我们支持生成带swagger注解的java代码,方便固化接口定义,也给用户多一种选择。
  • 接口导出:支持导出json、swagger等方式的数据用到其他场合,并且可以生成word格式的文件进行接口定义存档。

小结

感谢您能来到这里!希望您对HTTP已经有了一定的掌握,并且对HTTP在实际开发中所发挥的作用也有了一定的认识。作为一种基础性的Web通用技术,HTTP的应用范围极为广泛,请尽情地运用它吧!

参考资料:

这个帮助文档

链接地址:https://www.runoob.com/http/http-header-fields.html
该HTML地址包含超链接标记<a>用于实现超链接功能。
点击进入该链接地址即可跳转至对应的网页内容。
该超链接将访问指定的网页资源。
通过点击进入该链接地址可以打开相关网页信息。

该资源提供了以下详细信息:目标地址

原文链接

本文为阿里云原创内容,未经允许不得转载。

全部评论 (0)

还没有任何评论哟~