【从理论到应用】HTTP请求响应详解 (请求数据格式,请求方式,Web开发中的体现)


目录

一.HTTP协议 

二.HTTP请求数据格式 

请求方式

三.Web开发中的HTTP请求与响应

接收HTTP请求

同一响应格式

四.使用第三方工具发送HTTP请求(Apifox、postman、Yapi)


一.HTTP协议 

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。

HTTP的特点和工作原理如下:

  1. 无连接性:HTTP默认是无连接的,即每个请求都是一个独立的、独立的事务。当服务器完成对客户端请求的响应后,会立即关闭连接,不会保持长连接。这种无连接性可以节省服务器资源,但也会增加每个请求的延迟,因为需要重新建立连接。
  2. 无状态性:HTTP协议是无状态的,即服务器不会保存客户端的状态信息。每个请求都是独立的,服务器不会记住之前的请求。为了处理这个问题,引入了Cookie和Session机制,通过在客户端和服务器之间传递标识符来跟踪会话状态。
  3. 请求-响应模型:HTTP通过请求-响应模型进行通信。客户端发送一个HTTP请求,服务器接收并处理请求,并返回一个HTTP响应。响应包含响应状态码、响应头和响应体
  4. 支持多种请求方法:HTTP定义了多种请求方法,最常见的是GET和POST。其他常见的方法有PUT、DELETE、HEAD等,用于不同的操作和目的
  5. 使用URL定位资源:HTTP使用统一资源定位符(URL)来标识要获取的资源地址。URL包含协议、主机名、端口号和资源路径。
  6. 使用TCP作为传输协议:HTTP默认使用TCP作为传输协议,通过建立TCP连接来传输数据。TCP提供可靠的、面向连接的通信。

HTTP协议由请求和响应组成,它们都由报文(message)组成。报文包括报文头和报文体。报文头包含了请求/响应行、报文头部字段和换行符等信息。报文体包含了实际的请求/响应数据,如HTML文档。

总结起来,HTTP是一种简单、灵活、无连接、无状态的协议,广泛应用于Web开发和数据传输。它使用URL定位资源,通过请求-响应模型进行通信,使用TCP作为传输协议。


二.HTTP请求数据格式 

HTTP请求格式是由三部分组成:

  1. 请求行(Request line):包括请求方法、URL和协议版本。

    • 请求方法(Request method):表示要执行的操作,常见的方法有GET、POST、PUT、DELETE等。
    • URL(Uniform Resource Locator):表示要访问的资源路径。
    • 协议版本(Protocol version):表示使用的HTTP协议版本,如HTTP/1.1。
  2. 请求头部(Request headers):包括一些关于请求的额外信息,如User-Agent、Content-Type、Authorization等。

  3. 请求体(Request body):用于传输请求的数据,对于GET请求来说,请求体通常为空。

以下是一个示例HTTP请求的格式:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

在这个示例中:

请求行包括GET方法URL为/index.html协议版本为HTTP/1.1

请求头部包括HostUser-AgentAcceptAccept-EncodingAccept-Language等字段。

请求体为空,因为这是一个GET请求。

在上述实例中,申明了该请求是GET请求,我们最常用的请求方式就是GET和POST请求,二者在请求参数的传递中有很大不同,正如上述实例中所说:

GET请求的请求参数在请求行中,没有请求体

POST请求的请求参数在请求体中

下方是其他响应的实例,在响应体中则展示了许多参数的信息,可以包含一个简单的HTML,也可以返回一段JSON数据

HTTP/1.1 200 OK
Date: Wed, 02 Aug 2024 12:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Length: 123
Content-Type: text/html; charset=UTF-8<html>
<head><title>Example Page</title>
</head>
<body><h1>Hello, World!</h1><p>This is an example of an HTTP response.</p>
</body>
</html>
  • 状态行:HTTP/1.1 200 OK 表示HTTP版本是1.1,状态码是200,表示请求成功。
  • 响应头部:包含日期、服务器类型、内容长度和内容类型等信息。
  • 空行:头部和响应体之间的空行。
  • 响应体:实际返回的数据,这里是一个简单的HTML页面。
HTTP/1.1 200 OK
Date: Wed, 02 Aug 2024 12:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Length: 78
Content-Type: application/json; charset=UTF-8{"status": "success","data": {"id": 123,"name": "Example User","email": "user@example.com"}
}
  • 状态行:HTTP/1.1 200 OK 表示HTTP请求成功。
  • 响应头部:包含日期、服务器类型、内容长度、内容类型等信息。Content-Type 头部表明响应体是JSON格式。
  • 空行:头部和响应体之间的分隔。
  • 响应体:返回的JSON数据,包含状态、数据对象等信息。在实际应用中,这个JSON对象可以包含任何服务器想要返回的数据结构。

请求方式

除了上述最常用的GET请求和POST请求外,在HTTP请求响应中还有如下其他的请求方式

笔者这里选取一些相对常用的进行介绍:

  1. GET:用于从服务器获取资源,也是最常见的请求方式。GET请求将请求的参数附加在URL的末尾,发送给服务器。
  2. POST:用于向服务器提交数据,一般用于发送表单数据。POST请求将请求的参数放在请求的主体中,而不是URL中。
  3. PUT:用于向服务器上传文件或更新资源。PUT请求会将请求的数据存储在服务器上指定的位置。
  4. DELETE:用于删除服务器上的资源。
  5. HEAD:用于获取服务器对资源的头部信息,而不获取实际的资源内容。
  6. OPTIONS:用于获取服务器支持的请求方法。

此外,对于其他一些不太常见的请求方式,比如PATCH、TRACE等,用途较少。


三.Web开发中的HTTP请求与响应

HTTP请求广泛应用于现在的Web开发中,当前端给后端发送请求后,后端就需要响应这个请求,执行对应需要的操作,然后加工数据再返回给前端,从而达到前后端分离更高效的维护项目。

以下方代码举例,在传统的Servlet编程中,我们需要在申明一个HttpServletRequest对象,然后通过这个对象去拿到前端传给我们的数据,最后返回给前端一个“OK”的字符串。

    public String getNameAge(HttpServletRequest request) {//获取请求参数String name = request.getParameter("name");String ageStr = request.getParameter("age");int age = Integer.parseInt(ageStr);//... ...return "OK";}

接收HTTP请求

但这样的方式是非常低效的,我们可以通过使用Spring框架来帮助我们更高效的实现功能和需求,如下代码,使用SpringBoot的话在代码量上只管的就可以感受到快捷和轻便,通过简单的注解,就可以进行数据的获取,@RequestMapping表示请求的路径,@RestController表示该类可以接收用户的请求,并且可以响应结果

//SpringBoot方式
@RestController
public class RequestController {//简单类型参数@RequestMapping("/getNameAge")public String getNameAge(String name,Integer age) {//... ...return "OK";}

使用SpringBoot的话只需要请求参数名方法形式参数变量名相同,框架就会自动帮我们进行类型转化并且拿到数据

请求响应的参数类型

关于请求响应的参数部分,既可以是非常简单的基础类型,也可以是复杂的自定义类型

public class Student {private String name;private String age;private Address address;
}
public class Address {private String provice;private String city;
}
    //复杂类型参数@RequestMapping("/getpojo")public String getPojo(Student student) {System.out.println(student);return "OK";}

比如我们这里,自定义一个学生类,再在参数中使用学生类对象进行接收

此外数组和集合也是可以作为参数的

    //数组参数@RequestMapping("/array")public String getArray(String[] hobby) {System.out.println(Arrays.toString(hobby));return "ok";}
    //集合参数@RequestMapping("/list")public String getList(@RequestParam List<String> hobby) {System.out.println(hobby);return "ok";}

但是需要注意,在使用集合作为参数的时候,需要加上注解@RequestParam

日期时间参数在使用的时候同上,也要加上对应的注解@DateTimeFormat

    //日期时间参数@RequestMapping("/getdatetime")public String getTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {System.out.println(localDateTime);return "OK";}

还可以使用JSON格式的参数,但需加上对应的注解@RequestBody

    //JSON参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody Student student) {System.out.println(student);return "OK";}

路径参数也是在开发中最常用的一种,加上注释@PathVariable声明它是路径变量

    //路径参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}

存在多个路径参数的时候,可以用  ‘/’  将他们分开

    //路径参数@RequestMapping("/path/{id}/{name}")public String pathParam2(@PathVariable Integer id,@PathVariable String name) {System.out.println(id + "--" +name);return "OK";}

同一响应格式

在企业级开发中,为了方便阅读和管理,我们一般要求返回统一的数据格式

如下,各个响应的返回类型都不一样,这是不便于我们管理和操作的

@RestController
public class ResponseController {@RequestMapping("/hello")public String hello() {System.out.println("Hello world");return "Hello world";}@RequestMapping("/getAddr")public Address getAddress() {Address address = new Address();address.setProvice("河南省");address.setCity("洛阳市");return address;}@RequestMapping("/listAddr")public List<Address> listAddr() {List<Address> list = new ArrayList<>();Address addr1 = new Address();addr1.setProvice("河南省");addr1.setCity("洛阳市");Address addr2 = new Address();addr2.setProvice("广西省");addr2.setCity("桂林市");list.add(addr1);list.add(addr2);return list;}
}

因此我们写一个统一返回结果的类,然后将上述各自的返回值封装成这个结果类,然后统一进行返回 

经过上述的改善后,我们就可以得到如下的代码

@RestController
public class ResponseController {@RequestMapping("/hello")public Result hello() {System.out.println("Hello world");return new Result(1,"success","hello world");}@RequestMapping("/getAddr")public Result getAddress() {Address address = new Address();address.setProvice("河南省");address.setCity("洛阳市");return Result.success(address);}@RequestMapping("/listAddr")public Result listAddr() {List<Address> list = new ArrayList<>();Address addr1 = new Address();addr1.setProvice("河南省");addr1.setCity("洛阳市");Address addr2 = new Address();addr2.setProvice("广西省");addr2.setCity("桂林市");list.add(addr1);list.add(addr2);return Result.success(list);}
}

四.使用第三方工具发送HTTP请求(Apifox、postman、Yapi)

对于上述HTTP的请求响应和后端响应数据我们有了一些基础的理解后,我们就可以通过一些工具来帮助我们测试,我们能否成功的向后端发起请求,能否成功的拿到后端返回的数据,对此我们可以借助一些接口管理工具,诸如Yapi,postman,Apifox等

笔者这里使用Apifox进行举例,各个工具之间的使用方式是通用的,因此不需要担心方法不兼容的问题。

大体界面是这样的

我们这里只是进行基础的使用,我们可以点击目录旁边的添加接口

点击创建接口后,我们就可以看见如下的界面

对于数据请求的路径,除了图中说明的端口号后,还需注意端口号后的路径必须和请求路径相同,如下图 /hello 和接口中的 /hello 相同,所以就会调用这个 hello()方法

笔者这里给个示例,我们先运行Java项目,在控制台中就会显示本地的服务器端口号,如下图显示为8080

点击这里的运行

然后点击发送

然后就会根据路径找到项目中对应的方法,返回我们需要的数据

以上就是Apifox的基础使用方法,后序笔者会分享一些更高级的使用方式




 本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序web-view 嵌套h5界面 实现文件预览效果

实现方法&#xff1a;(这里我是在小程序里面单独加了一个页面用来下载预览文件) 安装 使用方法请参考文档 npm 安装 npm install weixin-js-sdk import wx from weixin-js-sdk预览 h5界面代码 <u-button click"onclick" type"primary" :loading"…

vue3使用Eachart图表库踩坑记录

前言 大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识。很久很更新了&#xff0c;最近一直在加班&#xff0c;今天记录一个eachar图表报警告说过去不到当前DOM节点的宽高导致页面中的图表宽高不正确的坑。 案例 就是一些基础的图形的使用&#xff0c;一个后…

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾&#xff1f;引用计数器和Root可达性算法 如何进行清除&#xff1f;标记清除、复制、标记整理 堆分代模型&#xff1f;Eden&#xff0c;Surevivor&#xff0c;Tenuring 一个对象从创建到消亡的过程&#xff1f; 对象什么时候进入老年代&#xff1f; 一、GC&a…

2.1、模版语法

2.1.1、插值语法 1、代码示例 <body><!-- 准备容器 --><div id"app"><!-- 在data中声明的 --><!--1、 data中声明的变量 --><h1>{{msg}}</h1><h1>{{sayHello()}}</h1><!-- 不在data中的变量不可以 -->…

小米手机突破小米社区5级等级限制解锁BL教程。小米手机解锁。

小米手机突破小米社区5级等级限制解锁BL教程 引言 小米社区对于解锁BootLoader&#xff08;BL&#xff09;的等级限制一直是一个热议话题。特别是对于小米澎湃OS用户来说&#xff0c;官方要求社区等级达到5级才能解锁BL&#xff0c;这对于许多用户来说是一个不小的挑战。不过…

UnityShaderLab-实现溶解效果

实现思路&#xff1a; 使用一张噪声图&#xff0c;与一个Cut值计算&#xff08;加或减&#xff09;&#xff0c;将计算后的值赋值给Alpha,然后小于0的片段就被丢弃掉了。 ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Dissolve" {Properties{_…

【24年新算法时间序列预测】黑翅鸢BKA优化Transformer时间序列预测(评估指标全,出图多)

本文采用黑翅鸢优化算法( BKA&#xff0c;2024年新算法)优化Transformer模型的超参数&#xff0c;形成了BKA-Transformer时间序列预测模型&#xff0c;以进一步提升其在时间序列预测中的性能&#xff0c;本文采用Matlab编写了BKA-Transformer时间序列预测模型代码&#xff0c;代…

快速学习selenium基础操作

全篇大概19000字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间1h 什么是Selenium&#xff1f; Selenium是一系列自动化工具集的统称&#xff0c;官方工具有 Selenium IDE、Selenium WebDriver、Selenium Grid&#xff0c; 主要用于桌面端Web应用程序的自动化。能够通…

互联网、物联网的相关标准

互联网的相关标准 网络通信协议&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型&#xff0c;客户端发送请求给服务器&#xff0c;服务器返回响应。HTTPS&a…

Milvus向量数据库06-RAG检索增强

Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程&#xff1a;为什么 RAG 优于传统的基于检索的方法&#xff1a;示例流程&#xff1a; 2-RAG和Elasticsearch对比3-RAG和向量数据库之…

Oracle定位行锁的数据行

背景 今天上午在查询行锁的事后发现v$lock的id1和id2&#xff0c;阻塞的和被阻塞的会话一样&#xff0c;这能说明什么&#xff1f; 既然是被阻塞了&#xff0c;那争用的应该是同一块数据&#xff0c;但是一个事务已经修改了&#xff0c;没提交数据块上还有前镜像的指针&#…

力扣-图论-8【算法学习day.58】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

jenkins安装(jdk1.8已安装)

1. 下载对应jenkins版本 https://mirrors.jenkins.io/war/ 2. 上传至服务器目录并启动 mkdir -p /root/jenkins cd /root/jenkins 上传文件 启动&#xff1a;nohup java -jar jenkins.war --httpPort9090 &> jenkins.log & 访问&#xff1a;http://ip:9090 选…

异步操作、Promise和axios

1.Javascript是单线程的 什么是进程&#xff0c;什么是线程&#xff1f; 进程&#xff1a;进程是操作系统分配资源和调度的基本单位。它是一个程序的实例&#xff0c;包含了运行程序所需的代码和数据以及其它资源。 线程&#xff1a;线程是进程中的实际运行单位&#xff0c;也是…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

基于视觉的3D占用网络汇总

综述文章:https://arxiv.org/pdf/2405.02595 基于视觉的3D占用预测方法的时间线概述: 自动驾驶中基于视觉的3D占用预测的分层结构分类 2023年的方法: TPVFormer, OccDepth, SimpleOccupancy, StereoScene, OccupancyM3D, VoxFormer, OccFormer, OVO, UniOcc, MiLO, Multi-…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…