HTTP协议

最近的项目需要频繁在前后端之间传输数据,本篇主要介绍HTTP协议以及数据传输方法。

1 HTTP协议

1.1 http协议简介

  HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是万维网上数据交换的基础,定义了客户端和服务器之间进行通信的规则。这里需要注意以下几点:

  • 超文本数据:指的是在网络上通过HTTP协议传输的HTML文档或其他超文本数据,可以包含文本、图片、链接、多媒体等元素,用于构建网页内容。
  • 客户端:发送HTTP请求想向服务端请求特定的资源或执行特定的资源,通常是指浏览器、移动应用、命令行工具(如curl)或其他通过HTTP发送请求的程序。
  • 服务端:接收并处理HTTP请求,根据请求的内容执行相应的操作,最后将结果封装在HTTP响应中返回给客户端。
1.2 http请求

  http请求是由客户端程序自动设置的,而不需要用户手动设置。一个完整的http请求主要包含以下信息:

  • 请求行(Request Line):包括请求方法、请求的资源路径和HTTP协议版本。例如:GET /index.html HTTP/1.1。目前常用的http请求方法包括:GETPOSTPUTDELETEHEADOPTIONSPATCHTRACE(已被禁用)、CONNECT。后文会详细介绍前7种方法。
  • 请求头部(Request Headers):主要包括请求元信息如HostUser-AgentContent-Type等。
  • 空行:请求头部与请求体之间必须有一个空行来表示头部的结束。
  • 请求体(Request Body):在某些请求中可能包含请求体,用于传输请求的数据,如 POST、PUT 请求。请求体的内容取决于具体的请求类型和应用需求。

http请求样例如下:

POST /api/login HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 36

{"username": "user123", "password": "pass456"}
1.3 http响应

HTTP 响应通常包含了服务端对客户端请求的回应信息,其中包括状态行、响应头部和响应体等组成部分。

  • 状态行:主要包含http协议版本、状态码和状态信息(与状态码相关的可读性描述)。常用的http响应的状态码及状态信息主要有:200 OK(请求成功)、301 Moved Permanently(永久重定向)、302 Found(临时重定向)、400 Bad Request(错误请求)、401 Unauthorized(未授权)、403 Forbidden(禁止访问)、404 Not Found(未找到)、500 Internal Server Error(内部服务器错误)和503 Service Unavailable(服务不可用)。
  • 响应头部:包含了多个响应头字段,例如 Date、Content-Type 和 Content-Length 等。
  • 空行:用于分隔响应头部和响应体。
  • 响应体:HTTP 响应体主要包含了服务器返回给客户端的实际数据或资源,其内容取决于具体的请求和服务器处理结果。

一个http响应样例如下(这里的响应体是一段html格式):

HTTP/1.1 200 OK
Date: Wed, 18 May 2024 12:00:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 127

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html

Tips: http请求和响应的头部信息中都可以添加用户自定义的设置。

1.4 请求体/响应体

  HTTP协议的请求体和响应体的数据类型并不完全一致,但相差不大,请求头和响应头中的Content-Type通常用来设定数据类习惯。常见的数据类型主要包括以下几种:

  • 表单数据:该类型通常采用application/x-www-form-urlencodedmultipart/form-data 编码。这种类型通常使用键值对的形式提交数据,常用于提交表单数据。举例如下(只展示必要信息, 下同)
Content-Type: application/x-www-form-urlencoded

username=user123&password=pass456
  • JSON数据:该类型常用于 Web API,通常使用application/json编码。举例如下:
Content-Type: application/json

{"username": "user123", "password": "pass456"}
  • XML数据:该类型常用于传输结构化数据,常采用application/xmltext/xml编码。举例如下:
Content-Type: application/xml

<user>
    <username>user123</username>
    <password>pass456</password>
</user>
  • 纯文本数据。举例如下:
Content-Type: text/plain
Content-Length: 23

This is a text message.
  • 二进制数据: 任意格式的二进制数据,如图片、音频、视频等。举例如下:
Content-Type: multipart/form-data; boundary=boundary123

--boundary123
Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg

[这里是二进制数据,表示图片文件的内容]
--boundary123--

2 HTTP请求方法

2.1 GET

  GET请求通过URL传递参数,并且参数会显示在URL的查询字符串中,因此适用于传输较少的数据,比如请求页面、查询数据等。其URL(资源请求路径,即客户端请求的资源在服务端上的位置或标识。)举例如下:

http://example.com/api/user?id=123

在这个URL中,http://example.com/api/user是请求的资源在服务端上的地址,id=123是GET请求所要传递给服务端的参数,服务端收到GET请求后,解析URL中的参数,根据参数执行相应的操作。
  GET请求通常用于查询数据,并且因为为URL长度有限,所以不适合传输大量数据。

2.2 POST

  POST方法是一种用于向服务器提交数据的请求方法。相比GET请求,POST请求通常使用请求体向服务器端传输更多、更复杂的数据,比如表单提交、文件上传等。其常用的URL结构如下:

http://example.com/api/register

  与GET请求相比,POST请求不是幂等的,即多次发送相同的POST请求,可能会导致服务器状态的变化,比如重复提交表单会创建多条数据。

2.3 PUT/PATCH

  PUT和PATCH方法都可以实现对服务器资源的更新,PUT可以实现全局更新,而PATCH可以实现局部更新。PATCH请求使用与PUT请求相同的URL结构,用于指定要更新的资源。其URL举例如下:

http://example.com/api/user/123

在这个URL案例中,123是要更新的用户的唯一标识符。而要更新的数据可以放在请求体中。

2.4 DELETE

  DELETE请求可以删除指定资源。它允许客户端从服务器上删除指定的资源。

2.5 HEAD

  HEAD请求是一种类似于GET请求的请求方法,但是服务器在响应中只返回头信息,不返回实体主体。HEAD请求通常用于获取目标资源的元数据,而不需要获取资源的实际内容。而服务器收到HEAD请求后,依然会执行相应的处理逻辑。但服务端不会返回实体主体,只返回头信息,这样可以节省带宽和处理时间。

2.6 OPTIONS

  OPTIONS 方法是一种用于询问服务器支持的请求方法和其他资源相关信息的请求方法之一。当客户端发送 OPTIONS 请求时,服务器会返回一个描述了资源的通用信息的响应。

2.7 案例
import requests

def test_get(base_url,api_router):
    url=base_url+api_router
    params={'username':'admin','password':'12345678'}
    response = requests.get(url,params=params)
    return response

def test_post(base_url,api_router):
    url=base_url+api_router
    data={'username':'admin123','password':'admin123'}
    response = requests.post(url,params=data)
    return response

def test_head(base_url,api_router):
    url=base_url+api_router
    params={'username':'admin','password':'12345678'}
    response = requests.head(url,params=params)
    return response

if __name__ == '__main__':
    base_url = 'http://127.0.0.1:5000'
    resp_get=test_get(base_url,'/login')
    print(resp_get.content.decode())
    
    resp_post=test_post(base_url,'/register')
    print(resp_post.content.decode())
    
    resp_head=test_head(base_url,'/login')
    print(resp_head.headers)   

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 03:10:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 03:10:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 03:10:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 03:10:04       18 阅读

热门阅读

  1. mybatis 模糊查询的几种方式

    2024-05-13 03:10:04       11 阅读
  2. Python 自动化脚本系列:第3集

    2024-05-13 03:10:04       13 阅读
  3. 拼接图片路径不显示:vue

    2024-05-13 03:10:04       10 阅读
  4. 力扣 516. 最长回文子序列 python AC

    2024-05-13 03:10:04       15 阅读
  5. 【linux软件基础知识】-cdev_alloc

    2024-05-13 03:10:04       11 阅读
  6. halcon学习之形状匹配

    2024-05-13 03:10:04       6 阅读
  7. logback 日志脱敏

    2024-05-13 03:10:04       7 阅读
  8. Google Gemma 2B 微调实战(IT科技新闻标题生成)

    2024-05-13 03:10:04       12 阅读
  9. 生成ssh来连接git

    2024-05-13 03:10:04       11 阅读
  10. 旋转木马案例

    2024-05-13 03:10:04       8 阅读
  11. HTTP 结构概述

    2024-05-13 03:10:04       11 阅读
  12. Android app通过jcifs-ng实现Samba连接共享文件夹

    2024-05-13 03:10:04       10 阅读
  13. MySQL教程-输入查询

    2024-05-13 03:10:04       10 阅读