接着一:可以通过端口访问公网IP之后
二需要实现:点击飞书多维表格中的按钮,向服务器发送HTTP请求,并执行脚本程序
向服务器发送HTTP请求:
发送请求需要明确一下几个点
- 请求方法:
由于是向服务器端发送值,因此选择的是POST请求 - 请求的URL:
请求的url就是http://公网IP:port/doc
a. http不可以写成https,否则会报首次握手失败 - 查询参数:
查询参数通常是在URL末尾以?开头的,多个参数使用&连接
http://公网IP:port/doc?name=liming&age=30 - 请求头:
一般用于描述请求的格式,认证信息和缓存控制等
比如Authorization,Content-Type等
在终端,-H "Content-Type: application/json"
-H "Authorization: Bearer my_token" 形式存在 - 请求体:
客户端发送给服务器的数据部分,通常用于提交表单,发送JSON数据,上传文件等
请求头中包含请求体的格式比如application/JSON,text/plain,multipart/form-data,application/X-www-form-urlencoded等
后端如何get上述请求中传输的变量
HTTP以不同形式传入的参数使用的get方法也是不一样
使用Flask处理HTTP请求
- 获取查询参数request.args.get('[变量名]')
get到的参数均是以字符串的形式存在
python
from flask import Flask, request
app = Flask(__name__)
@app.route('/doc', methods=['POST'])
def api():
# 获取查询参数
name = request.args.get('name') # 通过 request.args 获取 URL 查询参数
age = request.args.get('age')
# 获取 POST 请求的 JSON 数据
json_data = request.json # request.get_json() 也可以
return {"query_params": {"name": name, "age": age}, "body": json_data}
if __name__ == '__main__':
app.run(debug=True)
使用windows中的终端尝试是否能够访问端口并打印出内容,如果少了一个参数可能会导致服务器返回500 Internal Server Error错误
linux
curl -X POST "http://[公网IP]:[端口号]/doc?name=liming&age=30
- 获取请求头 request.headers.get()
python
user_agent = request.headers.get('User-Agent')
auth_token = request.headers.get('Authorization')
- 获取请求体
总结
python
request.json # 解析 JSON 数据
request.form # 解析表单数据(x-www-form-urlencoded)
request.files # 解析文件(multipart/form-data)
request.data # 读取原始请求体
a. Json请求体 request.json
在终端以
-d '{"name": "Alice", "age": 25}'的形式存在
python
data = request.json #这一句即可获取请求体
b. 表单发送请求体 request.form.get()
-d "username=alice&password=123456"
python
username = request.form.get("username")
password = request.form.get("password")
c.文件上传请求体
-F "file=@image.jpg"
python
file = request.files['file'] # 获取上传的文件
file.save(f"./uploads/{file.filename}")
客户端向服务器发送HTTP请求
第一种方式:requests请求,适合API请求
- 发送请求
python
import requests
url = "http://example.com/api"
headers = {"Content-Type": "application/json"}
data = {"key": "value"}
response = requests.request("POST", url, headers=headers, json=data)
print(response.json()) # 解析 JSON 响应
这种返回的是response.Response对象
可以通过方法返回想要得到的内容
python
response.status_code # 例如 200(成功)、400(请求错误)、500(服务器错误)
response.headers #服务器返回的HTTP的头部信息
response.text #以字符串的形式获取相应内容
response.content #以字节流的形式获取相应内容
如果返回的是JSON数据
python
data = response.json() # 解析 JSON 数据
data = response.json().get('data') # 从json中提取data字段的值,不会报错
.json()用于解析服务器返回的json数据,转化为python字段
.get('data')从解析后的JSON字段中获取data字段的值
第二种方式http.client适用于底层的HTTP处理
python
import http.client
import json
conn = http.client.HTTPSConnection("example.com") # 需要指定域名
headers = {"Content-Type": "application/json"}
payload = json.dumps({"key": "value"}) # 需要手动转换为 JSON 字符串
conn.request("POST", "/api", payload, headers)
res = conn.getresponse()
data = res.read().decode("utf-8") # 需要手动解码
print(data) # 这里是字符串,需要再用 json.loads(data) 解析
区别: