fastapi tests

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/get")
def get_test():
    return {"method": "get方法"}


@app.post("/post")
def post_test():
    return {"method": "post方法"}


@app.put("/put")
def put_test():
    return {"method": "put方法"}

@app.patch("/patch")
def patch_test():
    return {"method": "patch方法"}

@app.delete("/delete")
def delete_test():
    return {"method": "delete方法"}

@app.options("/options")
def options_test():
    return {"method": "options方法"}

@app.head("/head")
def head_test():
    return {"method": "head方法"}

@app.trace("/trace")
def trace_test():
    return {"method": "trace方法"}



# 02 多种请求测试
import uvicorn, asyncio
if __name__ == '__main__':
    # uvicorn.run("f02mufun:app", host="127.0.0.1", port=8000, reload=True)
    config = uvicorn.Config(app, host='0.0.0.0', port=8000)
    server = uvicorn.Server(config)
    asyncio.run(server.serve())

  

 

 
HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一,用于客户端和服务器之间的通信。在HTTP协议中,GETPOST 是两种最常见的请求方法,它们各自有不同的用途和特点。

1. GET 请求

GET 请求用于从服务器获取资源,是最常用的HTTP方法之一。

特点

  • 无副作用:GET 请求通常用于获取数据,不会对服务器上的资源进行修改或更新。
  • 参数通过URL传递:请求参数会附加在URL后面,格式为URL?参数1=值1&参数2=值2
  • 长度限制:由于参数是通过URL传递的,因此GET 请求的长度会受到URL长度的限制(通常浏览器限制在2048个字符左右)。
  • 缓存友好:GET 请求可以被浏览器缓存,也可以被搜索引擎索引。
  • 安全性较低:由于参数是通过URL传递的,因此敏感信息(如密码)不适合通过GET 请求传递。

应用场景

  • 获取网页内容:例如,访问一个网页或文章。
  • 搜索功能:通过在URL中传递搜索参数,如https://example.com/search?q=keyword
  • 获取资源:例如,下载文件或获取图片。

示例

请求:
复制
GET /index.html HTTP/1.1
Host: www.example.com
 
响应:
复制
HTTP/1.1 200 OK
Content-Type: text/html

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

2. POST 请求

POST 请求用于向服务器提交数据,通常用于创建或更新资源。

特点

  • 有副作用:POST 请求通常会修改服务器上的资源,例如提交表单数据、上传文件等。
  • 参数通过请求体传递:请求参数会放在HTTP请求体中,而不是URL中。因此,POST 请求的长度不受URL长度限制。
  • 不缓存:POST 请求不会被浏览器缓存,也不会被搜索引擎索引。
  • 安全性较高:由于参数是通过请求体传递的,因此比GET 请求更适合传递敏感信息。

应用场景

  • 提交表单数据:例如,用户注册、登录、提交评论等。
  • 上传文件:例如,上传图片、文档等。
  • 创建或更新资源:例如,向数据库中添加或修改记录。

示例

请求:
复制
POST /submit HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

username=example&password=12345
 
响应:
复制
HTTP/1.1 200 OK
Content-Type: text/html

<html>
<head><title>Submission Successful</title></head>
<body><h1>Your data has been submitted successfully!</h1></body>
</html>
 

GET 和 POST 的主要区别

表格
复制
特性GETPOST
用途 获取资源 提交数据
参数传递方式 URL 请求体
长度限制 受URL长度限制(约2048字符) 无限制
安全性 较低(参数在URL中) 较高(参数在请求体中)
缓存 可缓存 不缓存
搜索引擎索引 可索引 不索引
幂等性 幂等(多次请求效果相同) 非幂等(多次请求可能产生不同效果)

总结

  • 如果你需要从服务器获取数据,且没有敏感信息,GET 请求是一个很好的选择。
  • 如果你需要向服务器提交数据,尤其是涉及敏感信息或需要修改资源时,POST 请求更为合适。
 

 

 
Content-Type 是 HTTP 协议中的一个非常重要的头部字段,用于指示请求或响应中数据的媒体类型(MIME 类型)。它告诉服务器或客户端如何解析和处理请求或响应体中的数据。理解 Content-Type 的作用和常见类型对于开发 Web 应用和进行网络通信至关重要。

1. Content-Type 的作用

  • 在请求中:
    • 告诉服务器客户端发送的数据是什么格式。例如,是表单数据、JSON 数据还是文件数据。
    • 帮助服务器正确解析请求体中的内容。
  • 在响应中:
    • 告诉客户端服务器返回的数据是什么格式。例如,是 HTML 页面、JSON 数据还是图片。
    • 帮助客户端正确解析和显示响应内容。

2. 常见的 Content-Type 值

2.1 文本类型

  • text/html
    • 用于 HTML 文档。
    • 示例:Content-Type: text/html; charset=UTF-8
    • 用途:浏览器会将响应内容解析为 HTML 页面。
  • text/plain
    • 用于纯文本内容。
    • 示例:Content-Type: text/plain; charset=UTF-8
    • 用途:浏览器会将响应内容以纯文本形式显示。
  • text/css
    • 用于 CSS 文件。
    • 示例:Content-Type: text/css; charset=UTF-8
    • 用途:浏览器会将响应内容解析为 CSS 样式表。
  • text/javascriptapplication/javascript
    • 用于 JavaScript 文件。
    • 示例:Content-Type: application/javascript; charset=UTF-8
    • 用途:浏览器会将响应内容解析为 JavaScript 脚本。

2.2 JSON 类型

  • application/json
    • 用于 JSON 格式的数据。
    • 示例:Content-Type: application/json; charset=UTF-8
    • 用途:客户端和服务器之间传递 JSON 数据,常用于 RESTful API。

2.3 表单数据类型

  • application/x-www-form-urlencoded
    • 用于传统的 HTML 表单提交。
    • 示例:Content-Type: application/x-www-form-urlencoded
    • 用途:表单数据会以 key=value 的形式编码在请求体中,多个键值对之间用 & 分隔。
    • 示例请求体:username=example&password=12345
  • multipart/form-data
    • 用于上传文件或包含文件的表单提交。
    • 示例:Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
    • 用途:表单数据会以多部分格式编码,每部分之间用边界字符串(boundary)分隔。
    • 示例请求体:
      复制
      ------WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="file"; filename="example.txt"
      Content-Type: text/plain
      
      File content
      ------WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="description"
      
      This is a file upload
      ------WebKitFormBoundary7MA4YWxkTrZu0gW--
       

2.4 文件类型

  • image/jpeg
    • 用于 JPEG 图片。
    • 示例:Content-Type: image/jpeg
  • image/png
    • 用于 PNG 图片。
    • 示例:Content-Type: image/png
  • application/pdf
    • 用于 PDF 文件。
    • 示例:Content-Type: application/pdf
  • application/zip
    • 用于 ZIP 文件。
    • 示例:Content-Type: application/zip

2.5 其他常见类型

  • application/xml
    • 用于 XML 数据。
    • 示例:Content-Type: application/xml; charset=UTF-8
  • application/octet-stream
    • 用于二进制文件(如可执行文件)。
    • 示例:Content-Type: application/octet-stream
  • text/csv
    • 用于 CSV 文件。
    • 示例:Content-Type: text/csv; charset=UTF-8

3. Content-Type 的格式

Content-Type 的值通常由两部分组成:
  • 类型(Type):如 textapplicationimage 等。
  • 子类型(Subtype):如 htmljsonjpeg 等。
  • 参数(可选):如 charset=UTF-8,用于指定字符编码。
格式示例:
Content-Type: <type>/<subtype>; <parameter>
 

4. 如何使用 Content-Type

在请求中

  • 设置请求头:
    http
    复制
    POST /api/data HTTP/1.1
    Host: example.com
    Content-Type: application/json; charset=UTF-8
    Content-Length: 27
    
    {"username":"example","password":"12345"}
     

在响应中

  • 设置响应头:
    http
    复制
    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    
    <html>
    <head><title>Example Page</title></head>
    <body><h1>Hello, World!</h1></body>
    </html>
     

5. 常见问题

5.1 字符编码

  • 如果不指定 charset 参数,默认字符编码可能因浏览器或服务器而异,通常为 ISO-8859-1。
  • 推荐显式指定 charset=UTF-8,以避免编码问题。

5.2 错误的 Content-Type

  • 如果服务器返回的 Content-Type 与实际内容不符,客户端可能会无法正确解析内容。例如,返回 HTML 内容时错误地设置了 Content-Type: application/json,浏览器可能会报错。

5.3 文件上传

  • 文件上传时,必须使用 multipart/form-data 类型,并正确设置边界字符串(boundary)。
  • 边界字符串是多部分数据的分隔符,通常由浏览器或客户端工具自动生成。

6. 总结

Content-Type 是 HTTP 协议中非常重要的头部字段,用于指示数据的媒体类型。正确使用 Content-Type 可以确保客户端和服务器之间能够正确解析和处理数据。常见的 Content-Type 值包括文本类型、JSON 类型、表单数据类型和文件类型等。在开发 Web 应用时,务必根据实际需求选择合适的 Content-Type
 

 

 没有响应头

 

增加响应头

 

 

 

 

# 实现websocket 服务端,遵循http协议
import socket
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_server.bind(('localhost', 8000))
socket_server.listen(5) 
while True:
    conn, addr = socket_server.accept()
    print('Connected by', addr)
    # while True:
    data = conn.recv(1024)
    if not data:
        break
    print('Received client data:\n', data)
    # conn.sendall(data)
    conn.sendall(b'HTTP/1.1 200 OK\r\nserver:test\r\n\r\nhello world')  # 发送响应数据
    conn.close()

  

 
 

 

 

 

 

 

 

 
 

 

RESTful(Representational State Transfer,表述性状态转移)是一种基于网络的软件架构风格,用于设计网络应用程序,使其能够通过标准的 HTTP 协议与资源进行交互。它强调以资源为中心,通过统一的接口和标准的 HTTP 方法来操作资源。

RESTful 的核心概念

1. 资源(Resource)

资源是 RESTful 架构中的核心概念,它是网络上的一个实体或可寻址的组件。资源可以通过 URI(Uniform Resource Identifier,统一资源标识符)来唯一标识。例如:
  • 一个用户
  • 一篇文章
  • 一张图片
  • 一个订单
每个资源都有一个唯一的 URI,例如:
  • https://api.example.com/users/1
  • https://api.example.com/articles/2

2. 资源的表述(Representation)

资源的表述是资源的某种表现形式,通常是数据格式化的结果。常见的表述格式包括:
  • JSON
  • XML
  • HTML
  • 文本
例如,一个用户资源的 JSON 表述可能如下:
JSON
复制
{
  "id": 1,
  "name": "John Doe",
  "email": "john@example.com"
}
 

3. 状态转移(State Transfer)

状态转移是指客户端通过与资源的交互来改变资源的状态。客户端通过发送 HTTP 请求来获取资源的当前状态或修改资源的状态。状态转移是通过标准的 HTTP 方法实现的,例如:
  • GET:获取资源
  • POST:创建资源
  • PUT:更新资源
  • DELETE:删除资源
  • PATCH:部分更新资源

4. 无状态(Stateless)

RESTful 架构要求每个请求从客户端到服务器都包含所有必要的信息来理解和处理请求。服务器不会存储任何客户端请求之间的状态信息。这意味着每个请求都是独立的,服务器不会依赖于之前的请求状态。

RESTful 架构的约束条件

RESTful 架构遵循以下六个约束条件,这些约束条件共同定义了 RESTful 架构的风格:

1. 统一接口(Uniform Interface)

统一接口是 RESTful 架构的核心。它定义了客户端和服务器之间交互的规则,使得不同的客户端可以使用相同的接口与资源进行交互。统一接口包括以下四个方面:
  • 资源的识别(Resource Identification):通过 URI 来唯一标识资源。
  • 资源的表述(Resource Representation):通过标准的数据格式(如 JSON、XML)来表示资源。
  • 自描述的消息(Self-Descriptive Messages):每个请求都包含足够的信息来描述如何处理请求,例如 HTTP 方法、URI 和请求头。
  • 超媒体作为应用状态的引擎(HATEOAS):客户端通过超媒体链接(如 HTTP 链接)动态发现可用的资源和操作。

2. 无状态(Stateless)

每个请求都包含所有必要的信息来理解和处理请求。服务器不会存储任何客户端请求之间的状态信息。客户端可以保持状态,但服务器不会依赖于这些状态。

3. 可缓存(Cacheable)

为了提高效率,RESTful 架构允许响应被缓存。如果响应是可缓存的,客户端可以直接使用缓存的响应,而无需再次请求服务器。服务器需要明确指定响应是否可以被缓存。

4. 分层系统(Layered System)

RESTful 架构允许使用分层系统,客户端通常不知道它们是直接与服务器交互,还是与中间层(如代理、网关)交互。分层系统可以提高系统的可扩展性和安全性。

5. 统一的资源管理(Uniform Resource Management)

资源的管理是通过标准的 HTTP 方法来实现的,例如:
  • GET:获取资源
  • POST:创建资源
  • PUT:更新资源
  • DELETE:删除资源
  • PATCH:部分更新资源

6. 超媒体作为应用状态的引擎(HATEOAS)

客户端通过超媒体链接动态发现可用的资源和操作。这意味着客户端不需要提前知道所有可用的资源和操作,而是可以通过服务器提供的链接动态发现。

RESTful API 的设计原则

1. 资源的命名

  • 使用名词来表示资源,而不是动词。例如:
    • GET /users:获取用户列表
    • POST /users:创建新用户
    • GET /users/1:获取特定用户
    • PUT /users/1:更新特定用户
    • DELETE /users/1:删除特定用户
  • 使用复数形式来表示资源集合,例如 /users 而不是 /user

2. 使用标准的 HTTP 方法

  • GET:用于获取资源,不应产生副作用。
  • POST:用于创建资源,通常会生成一个新的资源。
  • PUT:用于更新资源,通常会替换整个资源。
  • DELETE:用于删除资源。
  • PATCH:用于部分更新资源。

3. 状态码

使用标准的 HTTP 状态码来表示请求的结果:
  • 200 OK:请求成功,返回资源。
  • 201 Created:资源已创建。
  • 204 No Content:请求成功,但没有内容返回。
  • 400 Bad Request:请求无效。
  • 401 Unauthorized:未授权。
  • 403 Forbidden:禁止访问。
  • 404 Not Found:资源未找到。
  • 405 Method Not Allowed:请求方法不被允许。
  • 409 Conflict:请求冲突。
  • 500 Internal Server Error:服务器内部错误。

4. 超媒体链接

在响应中包含超媒体链接,使客户端能够动态发现可用的资源和操作。例如:
JSON
复制
{
  "id": 1,
  "name": "John Doe",
  "email": "john@example.com",
  "_links": {
    "self": { "href": "/users/1" },
    "edit": { "href": "/users/1/edit" },
    "delete": { "href": "/users/1" }
  }
}
 

RESTful API 的示例

以下是一个简单的 RESTful API 示例,用于管理用户资源:

1. 获取用户列表

http
复制
GET /users
 
响应:
JSON
复制
[
  {
    "id": 1,
    "name": "John Doe",
    "email": "john@example.com"
  },
  {
    "id": 2,
    "name": "Jane Doe",
    "email": "jane@example.com"
  }
]
 

2. 创建新用户

http
复制
POST /users
Content-Type: application/json

{
  "name": "Alice",
  "email": "alice@example.com"
}
 
响应:
http
复制
201 Created
Location: /users/3
 

3. 获取特定用户

http
复制
GET /users/1
 
响应:
JSON
复制
{
  "id": 1,
  "name": "John Doe",
  "email": "john@example.com"
}
 

4. 更新特定用户

http
复制
PUT /users/1
Content-Type: application/json

{
  "name": "John Smith",
  "email": "john.smith@example.com"
}
 
响应:
http
复制
200 OK
 

5. 删除特定用户

http
复制
DELETE /users/1
 
响应:
http
复制
204 No Content
 

RESTful 架构的优点

  1. 简单易用:基于标准的 HTTP 协议,易于理解和使用。
  2. 可扩展性:通过分层系统和无状态交互,可以轻松扩展。
  3. 灵活性:支持多种数据格式(如 JSON、XML),可以根据需要选择合适的格式。
  4. 可缓存性:响应可以被缓存,提高性能。
  5. 松耦合:客户端和服务器之间通过统一接口交互,减少耦合。

RESTful 架构的缺点

  1. 性能问题:由于无状态交互,每次请求都需要携带所有必要信息,可能导致性能问题。
  2. 复杂性:对于复杂的业务逻辑,RESTful 架构可能不够灵活。
  3. 安全性:无状态交互可能导致安全问题,需要额外的安全机制。

总结

RESTful 架构是一种面向资源的架构风格,通过统一接口和标准的 HTTP 方法来操作资源。它强调简单性、可扩展性和灵活性,适用于构建现代的网络应用程序。通过遵循 RESTful 的设计原则,可以设计出高效、可维护的 API。
11
 

 

 

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
posted @ 2025-06-15 12:58  aiplus  阅读(37)  评论(0)    收藏  举报
悬浮按钮示例