HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 几种。POST通常用来向服务端提交数据,主要用于提交表单、上传文件。
HTTP 协议是以ASCII码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为四个部分:请求行、请求头、空行、请求体。本文对于post发送数据进行详细解读及人工智能实例。
如果需要向服务器发送数据,则使用 POST 方法。
POST 方法用于将数据提交到服务器以执行操作或存储数据以备后用。
Python 提供了一个名为“requests”的模块,允许使用 Python 发送 HTTP 请求。
要在 Python 中使用 post 方法,流程如下:
Python 的 requests 模块提供了名为?post()?的内置方法,用于向指定的 URI 发出 POST 请求。
语法
requests.post(url, params={key: value}, args)
POST提交数据的 4
种格式即Content-Type的4种形式,尤其注意每种格式中http发送请求时body中数据的格式。4种形式分别是:
import requests
url = 'https://www.example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.text)
?在实际操作中,需要根据数据的格式进行变换~
response.raw.status //响应状态码(200、301、404等)
response.raw.responseTime //响应时间(毫秒)
response.raw.type //响应类型(json等)
response.raw.responseText //响应文本
import requests
# URL 是api的端口
url = "https://example.com/api"
# 要往服务器发送的数据
data = {'name': 'Raju', 'age': 25}
# 发送一个post请求
response = requests.post(url, data=data)
# 从服务器得到响应
print(response.text)
导入了 requests 模块并创建了一个要发送的数据字典。
使用 requests 模块的 post 方法向服务器发送了一个包含数据和 URL 的 POST 请求。
最后,收到来自服务器的响应并打印。
import requests
import json
# URL 是要请求的API端口
url = "https://example.com/api"
#数据用json格式发送到服务器
data = {'name': 'Raju', 'age': 25}
json_data = json.dumps(data)
# 用json数据发送post请求到服务器
response = requests.post(url, json=json_data)
# 从服务器得到响应
print(response.text)
使用 json.dumps() 方法将数据字典转换为 JSON 字符串。
然后使用 json 参数而不是 data 参数向服务器发送包含 JSON 数据的 POST 请求。
最后从服务器接收响应并打印出来。
测试所需文件 flask构建的app.py文件,例如
from flask import Flask
from flask import request
import json
app = Flask(__name__)
@app.route('/',methods=['GET'])
def hello_world():
return 'hello world'
# 设置访问URL:'/test',methods:允许哪种方式访问
@app.route('/plus',methods=['POST'])
def plus():
data = json.loads(request.data.decode())
x = data['x']
y = data['y']
return json.dumps(x+y)
if __name__ == '__main__':
# 设置host,端口8080。threaded=True 代表开启多线程
app.run(host='0.0.0.0', port=8080, threaded=True)
?测试脚本call_app.py
import requests
url = 'http://127.0.0.1:8080/test'
h = requests.post(url=url,json={"x":2,"y":3})
print(h.text)
在人工智能应用中,第三方客户端需要请求正在运行的api端口,来返回查看api端口是否在运行,或者对于ai模型进行自动化测试。
此处flask app.py文件忽略~
# 20231219
import requests
def call_api(tts):
url = 'http://0.0.0.0:;1234'
data = {
'text': tts}
try:
response = requests.post(url, data=data)
if response.status_code == 200:
audio_data = response.content
with open('synthesized_audio.wav', 'wb') as audio_file:
audio_file.write(audio_data)
print("生成语音文件 synthesized_audio.wav !")
else:
print(f"Error code : {response.status_code}")
except requests.RequestException as e:
print(f"Error : {e}")
text_to_send = "测试文本 ~"
call_api(text_to_send)
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
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??#服务器当前不能处理客户端的请求,一段时间后可能恢复正常
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'text'
问题描述:因为语音合成中,输入的是文本,而在第三方客户端请求时,需要与语音合成中的api请求方式相同,
问题原因:
问题解决
在api文件中请求文本语句如下
? ? text = request.form["text"]
说明请求的格式是form-data,而不是json格式,所以在请求响应中也要写
? ? data = {'text': tts}
? ? ?response = requests.post(url, data=data)
?
(错误待解决)
import requests
headers = {"Content-Type": "audio/wav"}
url = 'http://0.0.0.0:1234'
def get_api():
# form-data
data = {"text":"语音合成测试.",}
res = requests.post(url,headers=headers, data=data)
print(res.text)
print(res.status_code)
return res,"语音合成完成 !"
if __name__ == '__main__':
get_api()
?在postman中是可以直接测试的,且这里Content-Type的类型是audio/wav
在第三方客户端测试时依旧出现【PS1】
【1】python requests post method
【2】Python’s Requests Library (Guide) – Real Python?
【3】Python发送Post请求及解析响应结果_python post请求-CSDN博客?
【4】python------接口(get请求、post请求), 图片、歌曲下载,网页返回,上传文件 - 文城清枫 - 博客园 (cnblogs.com)