Python POST到API请求问题

w1e3prcc  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(213)

我一直在用pytest在Python 3.10.10上进行API测试,我偶然发现了一个post请求的问题。下面是我目前拥有的代码:

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

第一次测试成功了!第二个DOE返回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。我不知道为什么会失败。
任何帮助我会非常感激!

axr492tv

axr492tv1#

我找到了两个解决方案!
一:如果我修改payload为:payload = "{\n \"title\": \"TItle\",\n \"description\": \"<p>DEscription</p>\",\n \"column_id\": 10124,\n \"lane_id\": 8629\n}"
穿过去了!
第二:如果我将请求data=payload更改为json=payload,也可以解决这个问题。

flvtvl50

flvtvl502#

根据您的反馈,以下是您遇到的问题。来自请求文档[https://requests.readthedocs.io/en/latest/user/quickstart/#passing-parameters-in-urls][1]
有时您可能希望发送未进行表单编码的数据。如果你传入一个字符串而不是一个dict,数据将被直接发布。
看来你的端点接受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中),这将做同样的事情。

相关问题