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

devtools/2024/12/5 3:18:14/

https://i-blog.csdnimg.cn/blog_migrate/2e6ad3ed486fba09ee850c3949be407f.gif" width="595" />


目录

一.HTTP协议 

二.HTTP请求数据格式 

请求方式

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

接收HTTP请求

同一响应格式

Apifox(postman)%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95-toc" style="margin-left:0px;">四.使用第三方工具发送HTTP请求(Apifoxpostman、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请求响应中还有如下其他的请求方式

https://i-blog.csdnimg.cn/blog_migrate/244ae7a876dfbcfbccf2ad42a34b7599.png" width="473" />

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

  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;}
}

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

https://i-blog.csdnimg.cn/blog_migrate/9c0cedd84958ade84d0ed5e959d2da55.png" width="563" />

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

@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);}
}

Apifox(postman)%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">四.使用第三方工具发送HTTP请求(Apifoxpostman、Yapi)

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

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

大体界面是这样的

https://i-blog.csdnimg.cn/blog_migrate/2ac755f93e26b61f2218fb37d493844f.png" width="576" />

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

https://i-blog.csdnimg.cn/blog_migrate/684e54732f334adeddb296b9c7f70684.png" width="334" />

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

https://i-blog.csdnimg.cn/blog_migrate/d92c132316c39a387c0576fb259b0c55.png" width="655" />

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

https://i-blog.csdnimg.cn/blog_migrate/3904f036f3e7467f4e31a178eb3ecd30.png" width="530" />

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

https://i-blog.csdnimg.cn/blog_migrate/c8f9e9458495d7dcad71c0133bf2012a.png" width="590" />

点击这里的运行

https://i-blog.csdnimg.cn/blog_migrate/0784b937c2691db9dcbb6a5aa0387bb3.png" width="573" />

然后点击发送

https://i-blog.csdnimg.cn/blog_migrate/d345bb8a97e1f1d221a1c0b9de14d94b.png" width="569" />

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

https://i-blog.csdnimg.cn/blog_migrate/66ab6c5396c942fd3275bf66e57c482e.png" width="645" />

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




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


http://www.ppmy.cn/devtools/139510.html

相关文章

[docker中首次配置git环境与时间同步问题]

11月没写东西&#xff0c;12月初赶紧水一篇。 刚开始搭建docker服务器时&#xff0c;网上找一堆指令配置好git后&#xff0c;再次新建容器后忘记怎么配了&#xff0c;&#xff0c;这次记录下。 一、git ssh指令法&#xff0c;该方法不用每次提交时输入密码 前期准备&#xff0…

详解 YOLOv5 模型运行参数含义以及设置及在 PyCharm 中的配置方法

详解 YOLOv5 模型运行参数含义以及设置及在 PyCharm 中的配置方法 这段代码中使用的命令行参数允许用户在运行 YOLOv5 模型时自定义多种行为和设置。以下是各个参数的详细说明和使用示例&#xff0c;以及如何在 PyCharm 中设置这些参数以确保正确运行带有参数的脚本。 命令行…

HTML技术贴:深入理解网页构建基础

引言 HTML&#xff08;HyperText Markup Language&#xff09;是构建网页和网络应用的基石。它是一种用于定义网页内容结构的标记语言&#xff0c;通过一系列的元素&#xff08;elements&#xff09;和属性&#xff08;attributes&#xff09;&#xff0c;HTML文档告诉浏览器如…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5&#xff1a;MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1&#xff1a;这种加密的密文特征跟MD5差不多&#xff0c;只不过位数是40&#xff08;sha256&#xff1a;64位&#xff1b;sha512:128位&#xff09; 3.HMAC&#xff1a;这…

Android直接播放麦克风采集到的声音

Android直接播放麦克风采集到的声音 Android直接播放麦克风采集到的声音_android 调用麦克风获取语音流-CSDN博客 class RecordThread extends Thread{ static final int frequency 44100; static final int channelConfiguration AudioFormat.CHANNEL_CONFIGURATION_MON…

【React 进阶】掌握 React18 全部 Hooks

一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量&#xff0c;可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state&#xff1a;状态&#xff0c;作为渲染视图的数据源 setState&#xff1a;改变st…

FPGA实战篇(触摸按键控制LED灯)

1.触摸按键简介 触摸按键主要可分为四大类&#xff1a;电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同&#xff0c;每种触摸按键都有其合适的使用领域。 电阻式触摸按键由多块导电薄膜按照按键的位置印制而成&#xff0c;但由于耐用性较差且维护复杂&#xff0c…