Python POST 到 API 请求问题

问题描述 投票:0回答:2

我一直致力于在 Python 3.10.10 上使用 pytest 进行 API 测试,并且偶然发现了一个发布请求的问题。这是我目前拥有的代码:

import requests as req

api = 'some api'
header = {
    'Apikey': 'some token',
    'Content-Type': 'application/json'
}

payload = {
    "title": "TItle",
    "description": "<p>DEscription</p>",
    "column_id": 12345,
    "lane_id": 1234
}

URL = api + '/cards'

card_id = 0

def test_get_card():
    x = req.get(
        URL,
        headers=header,
        params={'cards_id': 123456}
    )

    assert x.status_code == 200

def test_create_card():
    x = req.post(
        URL,
        headers=header,
        data=payload
    ).json()

    print(x)

    assert x.status_code == 200

第一次测试成功! 第二只母鹿返回 400 和

Please provide a column_id for the new card with reference CCR or have it copied from an existing card by using card_properties_to_copy.

如果我在

Insomnia
中运行相同的请求,它会返回 200。我不明白为什么它会失败。

python python-3.x api https pytest
2个回答
1
投票

根据您的反馈,这是您遇到的问题。来自请求文档 [https://requests.readthedocs.io/en/latest/user/quickstart/#passing-parameters-in-urls][1]

有时您可能想要发送未进行表单编码的数据。如果您传入字符串而不是字典,则该数据将直接发布。

看来您的端点接受 JSON-ENCODED。在这种情况下,您需要

import json
并将您的
test_create_card
函数更新为以下内容。

def test_create_card():
    x = req.post(
        URL,
        headers=header,
        data=json.dumps(payload)
    ).json()

    print(x)

    assert x.status_code == 200

或者正如您发现的那样,使用 json 参数(版本 >= 2.4.2 中)传递有效负载,这将执行相同的操作。


0
投票

所以我找到了两个解决方案!

一: 如果我将有效负载修改为:

payload = "{\n    \"title\": \"TItle\",\n    \"description\": \"<p>DEscription</p>\",\n    \"column_id\": 10124,\n    \"lane_id\": 8629\n}"

它通过了!

二: 如果我将请求 data=payload 更改为 json=payload 也可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.