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

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

码农世界 2024-05-16 后端 72 次浏览 0个评论

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】

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

              参考文献

              【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博客 

转载请注明来自码农世界,本文标题:《Python | Flask测试:发送post请求的接口测试》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,72人围观)参与讨论

还没有评论,来说两句吧...

Top