HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 几种。POST通常用来向服务端提交数据,主要用于提交表单、上传文件。

HTTP 协议是以ASCII码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为四个部分:请求行、请求头、空行、请求体。本文对于post发送数据进行详细解读及人工智能实例。

Python Requests中的Post 方法

如果需要向服务器发送数据,则使用 POST 方法。

POST 方法用于将数据提交到服务器以执行操作或存储数据以备后用。

Python 提供了一个名为“requests”的模块,允许使用 Python 发送 HTTP 请求。

要在 Python 中使用 post 方法,流程如下:

导入 requests 模块创建要发送的数据字典向服务器发送包含数据和 URL 的 POST 请求从服务器获取响应

Python 的 requests 模块提供了名为 post() 的内置方法,用于向指定的 URI 发出 POST 请求。语法

requests.post(url, params={key: value}, args)

POST提交数据的 4 种格式即Content-Type的4种形式,尤其注意每种格式中http发送请求时body中数据的格式。4种形式分别是:

application/x-www-form-urlencoded:URL encodedmultipart/form-data:键值对型数据application/json:Json 类型数据text/xml:xml

1.1.基本方法

import requests

url = 'https://www.example.com/api'

data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post(url, data=data)

print(response.text)

 在实际操作中,需要根据数据的格式进行变换~

1.2.多种响应参数变量

response.raw:原始响应数据,调用示例:

response.raw.status //响应状态码(200、301、404等)

response.raw.responseTime //响应时间(毫秒)

response.raw.type //响应类型(json等)

response.raw.responseText //响应文本

response.json:json格式的响应数据 response.headers:响应头 response.cookies :响应cookie

data数据实例

form表单形式请求数据text

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 请求。

最后,收到来自服务器的响应并打印。

json数据实例

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 请求。

最后从服务器接收响应并打印出来。

1.3.使用 POST 方法的优缺点

使用 POST 方法的优点

它比 GET 更安全,因为用户输入的信息在 URL 查询字符串或服务器日志中永远不会可见。可以传递的数据量有更大的限制,可以使用 POST 发送文本数据和二进制数据(上传文件)。

使用 POST 方法的缺点

由于 POST 方法发送的数据在 URL 中不可见,因此无法使用特定查询为页面添加书签。从不缓存 POST 请求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)

2.✨人工智能模型中的应用

在人工智能应用中,第三方客户端需要请求正在运行的api端口,来返回查看api端口是否在运行,或者对于ai模型进行自动化测试。

2.1.语音类

语音合成类发送post请求的接口

此处flask app.py文件忽略~

客户端调用(测试文件)call_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)

2.2.文本类

此处flask app.py文件忽略~

客户端调用(测试文件)call_app.py

import requests

data = {

"text": "NO MARK PLASTIC SCRAP - PET BOTTLE FLAKES WHITE NW. 131,022.00 KGS. 21DAYS FREE TIME DETENTION"

}

header = {"Content-Type": "application/json; charset=utf-8"}

url = "http://服务器IP地址:3344/predict?"

response = requests.post(url, json=data, headers=header)

res = response.json()

print(res)

常见的错误数字状态

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: 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  #服务器当前不能处理客户端的请求,一段时间后可能恢复正常

遇到的错误及解决

【P1】flask request未获取到请求参数问题

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)

【5】python接口自动化(十)--post请求四种传送正文方式(详解)_python post请求-CSDN博客 

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: