http协议详解
书接上文esp32通过wifi进行http请求获得天气信息
本文为http协议详解 并通过套接字(socket)方法进行httpGET请求
简介
HTTP:HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。为典型的CS应用,HTTP 是一种无状态 (stateless) 协议, HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。
正文
HTTP URL
HTTP URL 包含了用于查找某个资源的详细信息, 格式如下:
http://host[":"port][abs_path]
HTTP请求

由上图可以看到,http请求由请求行,消息报头,请求正文三部分构成。
请求行
最上面一行为请求行。
请求行由请求Method, URL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:
GET /example.html HTTP/1.1 (CRLF)
HTTP协议的方法有: GET: 请求获取Request-URI所标识的资源 POST: 在Request-URI所标识的资源后增加新的数据 HEAD: 请求获取由Request-URI所标识的资源的响应消息报头 PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识 DELETE: 请求服务器删除Request-URI所标识的资源 TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT: 保留将来使用 OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求
其中example.html为路径部分,不是完整的URL(被这点小问题折磨一天)
HTTP请求报头
消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:
HTTP请求正文
只有在发送POST请求时才会有请求正文,当请求方法为GET时,请求正文省略。
HTTP请求报文
1 | |
HTTP响应
也先上图
HTTP响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息 - 表示请求已接收,继续处理2xx:成功 - 表示请求已被成功接收、理解、接受3xx:重定向 - 要完成请求必须进行更进一步的操作4xx:客户端错误 - 请求有语法错误或请求无法实现5xx服务器端错误 - 服务器未能实现合法的请求常见状态代码、状态描述、说明: 200: OK - 客户端请求成功 400: Bad Request - 客户端请求有语法错误,不能被服务器所理解 401: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403: Forbidden - 服务器收到请求,但是拒绝提供服务 404: Not Found - 请求资源不存在,eg:输入了错误的URL 500: Internal Server Error - 服务器发生不可预期的错误 * 503: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

HTTP响应报文

实现HTTP请求的方法步骤(以esp32为例)
方法 来自ChatGPT
- 使用HTTP库:许多编程语言和平台都提供了用于HTTP请求的内置或第三方库。这些库通常封装了Socket API,并提供了更高级的接口来方便地执行HTTP请求和处理响应。例如,在C语言中,你可以使用libcurl、libhttp、libmicrohttpd等库来执行HTTP请求。
- 使用HTTP客户端库:许多编程语言和平台都提供了专门用于执行HTTP请求的HTTP客户端库。这些库通常提供了更高级的API,用于构建和发送HTTP请求,并处理响应。例如,Python中的Requests库、JavaScript中的Axios库等。
- 使用网络框架:许多网络框架和服务器框架提供了HTTP客户端功能,可以用于执行HTTP请求。这些框架通常提供了简单易用的API,用于发送HTTP请求和处理响应。例如,Node.js中的Express框架、Java中的Spring框架等。
- 使用系统级API:某些操作系统提供了系统级的API来执行HTTP请求。这些API通常是在操作系统网络栈的底层实现,因此可以直接与网络通信进行交互。例如,Windows平台提供了WinINet API、Linux平台提供了cURL库等。
- 最接近底层的实现是使用Socket API。尽管其他方法提供了更高级的抽象和易用性,但它们最终都会使用Socket API或类似的底层网络接口来进行实际的网络通信。
本次来讲socket方法进行http请求
socket请求步骤 来自ChatGPT
- 创建Socket连接:首先,你需要创建一个Socket连接到服务器。使用 socket() 函数来创建一个Socket描述符。
- 解析主机名:如果你使用主机名来连接服务器,你需要将主机名解析为IP地址。可以使用 getaddrinfo() 函数来实现。它会将主机名解析为一个或多个地址结构。
- 连接服务器:使用 connect() 函数将Socket连接到服务器。需要提供服务器的IP地址和端口号。
- 构建HTTP请求:构建符合HTTP协议规范的请求。通常,这包括构建请求行、请求头和请求体。请求行包括请求方法(如GET、POST)、请求的URI和HTTP版本。请求头包括一些关于请求的元信息,如Host、Content-Type等。请求体包括发送给服务器的数据(如果有的话)。
- 发送HTTP请求:使用 send() 函数发送构建好的HTTP请求到服务器。
- 接收HTTP响应:使用 recv() 函数从服务器接收HTTP响应。你可以一次性接收全部响应,也可以分块接收。
- 解析HTTP响应:解析接收到的HTTP响应,包括状态行、响应头和响应体。状态行包括HTTP版本、状态码和状态消息。响应头包括服务器的一些元信息,如Content-Type、Content-Length等。响应体包括服务器返回的实际数据。
- 关闭Socket连接:当你完成HTTP请求和响应后,使用 close() 函数关闭Socket连接。
贴个代码
1 | |