如何用python表示请求的复杂POST数据

2024-05-14 09:11:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动化一个web表单。当我在Chrome中实际运行查询时,有效负载在inspect窗口上如下所示。。。在

    data: [{"property":"TimeQuick","value":"Active"},{"property":"TimeQuickDurationOptions","value":3},{"property":"TimeQuickStartDate","value":"05/15/2019 00:00:00"},{"property":"TimeQuickEndDate","value":"05/15/2019 23:59:59"},{"property":"ProviderCode","value":["FPL"]},{"property":"SellerCode","value":[""]},{"property":"Ref","value":""},{"property":"POR","value":["SOCO"]},{"property":"POD","value":["FPC"]},{"property":"Path","value":""},{"property":"ServiceIncrement","value":["DAILY"]},{"property":"TSClass","value":[""]},{"property":"TSType","value":[""]},{"property":"TSWindow","value":""},{"property":"TSPeriod","value":""},{"property":"TSSubClass","value":""},{"property":"Time","value":"Active"},{"property":"TimeDurationOptions","value":3},{"property":"TimeStartDate","value":"05/15/2019 00:00:00"},{"property":"TimeEndDate","value":"05/15/2019 23:59:59"},{"property":"ShowActiveData","value":true},{"property":"DaylightSavings","value":false}]
    sort: [{"property":"TOL","direction":"DESC","root":"data"}]
    pagingEnabled: 1
    page: 1
    limit: 50

我试着用这样的python变量来表示它

^{pr2}$

当我运行s.post(myurl, data=datareq, cert=mycerts)时,我得到了以下错误:

^{3}$

我假设问题出在我构造datareq变量的方式上。什么是合适的方式来做这个职位?在

编辑/更新: 我试过亚历克斯和伊万的建议,但都没用。他们每个人都给我一个来自服务器的神秘消息success=false。如果我用json=datareq而不是data=datareq来尝试它们,那么我会从服务器得到一个0结果的响应,尽管它应该有很多结果,所以看起来这是越来越接近,但仍然不是所有的方式。在


Tags: 服务器webfalse表单datavalue方式property
3条回答

服务器希望POST正文的类型是application/json还是{}?如果是json,那么使用语法request.post(url, json=payload_dict, ....)(注意jsonkwarg而不是{})。如果使用data,那么它将采用内容类型application/x-www-form-urlencoded,而{}采用json。如果它确实需要json,这是有意义的,因为数据嵌套了几层,那么我将扩展@Işık Kaplan的答案:

# the dict as posted by @Işık Kaplan
payload = {
    "data": [
        {"property": "TimeQuick", "value": "Active"}, 
        {"property": "TimeQuickDurationOptions", "value": 3},
        {"property": "TimeQuickStartDate", "value": "05/15/2019 00:00:00"},
        {"property": "TimeQuickEndDate", "value": "05/15/2019 23:59:59"},
        {"property": "ProviderCode", "value": ["FPL"]},
        {"property": "SellerCode", "value": [""]},
        {"property": "Ref", "value": ""},
        {"property": "POR", "value": ["SOCO"]},
        {"property": "POD", "value": ["FPC"]},
        {"property": "Path", "value": ""},
        {"property": "ServiceIncrement", "value": ["DAILY"]},
        {"property": "TSClass", "value": [""]},
        {"property": "TSType", "value": [""]},
        {"property": "TSWindow", "value": ""},
        {"property": "TSPeriod", "value": ""},
        {"property": "TSSubClass", "value": ""},
        {"property": "Time", "value": "Active"},
        {"property": "TimeDurationOptions", "value": 3},
        {"property": "TimeStartDate", "value": "05/15/2019 00:00:00"},
        {"property": "TimeEndDate", "value": "05/15/2019 23:59:59"},
        {"property": "ShowActiveData", "value": True},
        {"property": "DaylightSavings", "value": False}],
    "sort": [
        {"property": "TOL", "direction": "DESC", "root": "data"}
    ],
    "pagingEnabled": 1,
    "page": 1,
    "limit": 50,
}

# assuming you have variables named `s`, `myurl`, and `mycerts`
# note `json=payload`, not `data=payload`
s.post(myurl, json=payload, cert=mycerts)

尽管您的datareq数据结构通常对python有效,但它不能用作requests.post方法中的data参数。在

它不是显式编写的,但是如果您为requests库读取documentation,您会注意到data参数应该是普通pythondict,或者是{}的list,其中顶层的每个元组正好包含2个成员-一个键和一个值。在

这正是您的traceback输出的结果:

ValueError: too many values to unpack (expected 2)

特别是,您在datareq中的第一个tuple无效:

^{pr2}$

,因为data应该是“key”,而其他{}的东西应该是“value”。在


要使其正确,datareq应该如下所示:

datareq = [
    ('data', 
        (  # note tuple here
            {'property':'TimeQuick', 'value':'Active'},
            {"property":"TimeQuickDurationOptions","value":'3'},
            {"property":"TimeQuickStartDate","value":"05/15/2019 00:00:00"},
            {"property":"TimeQuickEndDate","value":"05/15/2019 23:59:59"},
            {"property":"ProviderCode","value":["FPL"]},
            {"property":"SellerCode","value":[""]},
            {"property":"Ref","value":""},
            {"property":"POR","value":["SOCO"]},
            {"property":"POD","value":["FPC"]},
            {"property":"Path","value":""},
            {"property":"ServiceIncrement","value":["DAILY"]},
            {"property":"TSClass","value":[""]},
            {"property":"TSType","value":[""]},
            {"property":"TSWindow","value":""},
            {"property":"TSPeriod","value":""},
            {"property":"TSSubClass","value":""},
            {"property":"Time","value":"Active"},
            {"property":"TimeDurationOptions","value":3},
            {"property":"TimeStartDate","value":"05/15/2019 00:00:00"},
            {"property":"TimeEndDate","value":"05/15/2019 23:59:59"},
            {"property":"ShowActiveData","value":'true'},
            {"property":"DaylightSavings","value":'false'},
        ),
    ),
    ('sort',  # same goes for the "sort" key
        (
            {"property":"TOL","direction":"DESC","root":"data"},
        ),
    ),
    ('pagingEnabled', 1),
    ('limit', 50),
]

我会用的是:

datareq = {
    "data": {
        "TimeQuick": 'Active',
        "TimeQuickDurationOptions":'3',
        "TimeQuickStartDate":"05/15/2019 00:00:00",
        "TimeQuickEndDate":"05/15/2019 23:59:59",
        "ProviderCode":["FPL"],
        "SellerCode":[""],
        "Ref":"",
        "POR":["SOCO"],
        "POD":["FPC"],
        "Path":"",
        "ServiceIncrement":["DAILY"],
        "TSClass":[""],
        "TSType":[""],
        "TSWindow":"",
        "TSPeriod":"",
        "TSSubClass":"",
        "Time":"Active",
        "TimeDurationOptions":3,
        "TimeStartDate":"05/15/2019 00:00:00",
        "TimeEndDate":"05/15/2019 23:59:59",
        "ShowActiveData":'true',
        "DaylightSavings":'false'
    },
    "sort": {
        "TOL": {
            "direction":"DESC",
            "root":"data"
        }
    },
    "pagingEnabled":1,
    "limit":50
}

以及使用给定属性:

^{pr2}$

相关问题 更多 >

    热门问题