Python | Flask测试:发送post请求的接口测试

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 方法,流程如下:

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

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 encoded
  • multipart/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博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用GMAT进行卫星轨道仿真

文章目录 设计飞行器预报模型配置轨道图配置预报命令运行和分析 GMAT是一跨开源轨道设计软件,官网挂着NASA的名字,看上去十分给力。 下载之后直接解压,可执行文件在bin目录下,双击GMAT.exe,就可以进入其欢迎界面了。G…

新版Android Studio Logcat 筛选日志

下载了新版的Android Studio,android-studio-2022.3.1.21-mac_arm,记录一下新版本AS的logcat过滤日志条件 1. 按照包名过滤 1.1 过滤当前包名的日志 package:mine 1.2 过滤其他包名日志 package:com.example.firstemptyapplication 2. 按照日志等级过滤…

Qt之使用QListView加载相册(富文本ToolTip)

一.效果 二.实现 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QStandardItemModel> #include <QFont>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QFont…

使用Httpclient来替代客户端的jsonp跨域解决方案

最近接手一个项目&#xff0c;新项目需要调用老项目的接口&#xff0c;但是老项目和新项目不再同一个域名下&#xff0c;所以必须进行跨域调用了&#xff0c;但是老项目又不能进行任何修改&#xff0c;所以jsonp也无法解决了&#xff0c;于是想到了使用了Httpclient来进行服务端…

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

Axure中继器的使用

目录 一. 中继器 概述 作用 运用场景 二. 中继器的使用 三. 三列表格增删改查案例展示 一. 中继器 概述 在Axure软件中&#xff0c;中继器&#xff08;Repeater&#xff09;是一种特殊的控件&#xff0c;它的作用是允许用户创建重复的数据项&#xff0c;并以列表或表格…

React实现全局Loading

css #__loading {position:fixed;top: 0;left: 0;z-index: 99999;display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;background: rgba(0, 0, 0, 0); } 页面代码 使用了antd的Spin组件 import React from react import ReactDOM from re…

IDEA进行远程Debug调试的来龙去脉

一、前言 我们在测试环境时&#xff0c;遇到一些bug&#xff0c;看上下文的日志&#xff0c;还是无法判断出问题所在时&#xff0c;此时需要Debug来解决。 为了更方便、更高效地定位和解决问题&#xff0c;远程调试成为一种常见的实践方式。 这个还是不建议在生产中使用&…

华为交换配置OSPF与BFD联动

实验拓扑 组网需求 如图所示&#xff0c;SW1、SW2和SW3之间运行OSPF&#xff0c;SW1和SW2之间的交换机仅作透传功能。现在需要SW1和SW2能够快速感应它们之间的链路状态&#xff0c;当链路SW1-SW2发生故障时&#xff0c;业务能快速切换到备份链路SW1-SW3-SW2上 配置思路 采用…

Postman使用总结--案例集合导出和导入

Postman导出用例集功能 注意&#xff1a;导出时如果有环境变量的&#xff0c;一定记住把环境变量一起导出还有参数文件&#xff1b; 导出环境变量一定和刚刚导出的案例集合放在一起&#xff01;&#xff01;&#xff01; Postman导入用例集功能

Android13音频录制适配

Android13音频录制适配 前言&#xff1a; 之前写过一篇音频录制的文章&#xff0c;当时是在Android10以下的手机可以成功录制和播放&#xff0c;但是Android10及以上手机提示创建文件失败&#xff0c;最近做过Android13的适配&#xff0c;索性一起把之前的录音也适配了&#…

使用docker-compose搭建docker私服与配置WebUI

简介 本文介绍了使用docker compose 搭建 docker私服 环境 Docker version 24.0.6, build ed223bc Docker Compose version v2.21.0 正文 一、创建registry文件夹 我的路径是/usr/loca/docker/registry 二、创建并编写docker-compose.yml version: "3.9" services…

《深入理解计算机系统》学习笔记 - 第六课 - 机器级别的程序二

Lecture 06 Machine Level Programming II Control 机器级别程序控制二 文章目录 Lecture 06 Machine Level Programming II Control 机器级别程序控制二处理器的状态条件码&#xff08;隐式设置&#xff09;通过算术运算隐式设置条件码(将其视为副作用)通过cmp比较命令显示的设…

关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出&#xff0c;目前遇到一个需求&#xff0c;如下图&#xff1a; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metad…

【Windbg】学习及在CTF中解题

1、Windbg介绍 Windbg是一款Windows强大的调试器&#xff0c;可以调试0和3环的程序。 在实际开发中&#xff0c;可以调试我们的错误程序&#xff0c;从而定位关键代码&#xff0c;进行程序代码修复。 WinDbg 是一种调试器工具&#xff0c;由微软公司开发&#xff0c;用于分析…

Springboot数据校验与异常篇

一、异常处理 1.1Http状态码 HTTP状态码是指在HTTP通信过程中&#xff0c;服务器向客户端返回的响应状态。它通过3位数字构成&#xff0c;第一个数字定义了响应的类别&#xff0c;后两位数字没有具体分类作用。以下是常见的HTTP状态码及其含义&#xff1a; - 1xx&#xff08;信…

C#二甲医院实验室信息系统源码

医院实验室信息系统简称(Hospitallaboratoryinformationsystem)&#xff0c;也可以称作实验室&#xff08;检验科&#xff09;信息系统或者LIS系统。 LIS定义 其主要功能是将检验的实验仪器传出的检验数据经分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据…

STM32能够做到数据采集和发送同时进行吗?

STM32能够做到数据采集和发送同时进行吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「STM32的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

2023ChatGPT浪潮,2024开源大语言模型会成王者?

《2023ChatGPT浪潮&#xff0c;2024开源大语言模型会成王者&#xff1f;》 一、2023年的回顾 1.1、背景 我们正迈向2023年的终点&#xff0c;回首这一年&#xff0c;技术行业的发展如同车轮滚滚。尽管互联网行业在最近几天基本上处于冬天&#xff0c;但在这一年间我们仍然经…

Spring Boot + MinIO 实现文件切片极速上传技术

文章目录 1. 引言2. 文件切片上传简介3. 技术选型3.1 Spring Boot3.2 MinIO 4. 搭建Spring Boot项目5. 集成MinIO5.1 配置MinIO连接信息5.2 MinIO配置类 6. 文件切片上传实现6.1 控制器层6.2 服务层6.3 文件切片上传逻辑 7. 文件合并逻辑8. 页面展示9. 性能优化与拓展9.1 性能优…