【问题标题】:Error passing curl -d parameter in requests library在请求库中传递 curl -d 参数时出错
【发布时间】:2020-09-30 23:45:36
【问题描述】:

我有一个curl POST 请求,它在终端 (macOS) 中完美运行,并按预期返回 csv。 RJMetrcis documentation 中提供了以下格式(请参阅“导出图形数据”)。这是 bash 中的 curl 请求:

 curl -d "format=csv&includeColumnHeaders=1" -H "X-RJM-API-Key: myAPIkey" https://api.rjmetrics.com/0.1/figure/0000/export

我的目标是使用requests 在 Python 中实现 exact 相同的 curl 请求。当我输入与 POST 请求相同的参数时,代码不起作用并返回错误:

import requests


headers = {'X-RJM-API-Key: myAPIkey'}
data= {'format=csv&includeColumnHeaders=1'}
url = "https://api.rjmetrics.com/0.1/figure/0000/export"

response = requests.post(url, data, headers)

这会返回错误:

TypeError: memoryview: a bytes-like object is required, not 'str'

第二次尝试:

response = requests.post(url, data=data, headers=headers)

返回

AttributeError: 'set' object has no attribute 'items'

在 python 中构建 POST 请求的正确格式是什么,以使其符合 data = {'key':'value'} 约定并返回 csv?将 bash curl POST 转换为 python POST 请求的任何帮助将不胜感激

【问题讨论】:

    标签: python csv curl python-requests


    【解决方案1】:

    在这里你传递一个集合,你应该传递一个 dict 或 str 对象

    data= {'format=csv&includeColumnHeaders=1'}
    

    替换为

    data= {'format':'csv&includeColumnHeaders=1'}
    

    应该修复它。

    另一方面,通过查看您的 curl 请求..

    这完全取决于您希望如何传递数据,以下代码(将数据有效负载作为字符串传递)将直接发布数据,这相当于 curl 中的 --data-raw

    import requests
    
    url = "https://api.rjmetrics.com/0.1/figure/0000/export"
    
    payload = "'{\"format\":\"csv&includeColumnHeaders=1\"}'"
    headers = {
      'X-RJM-API-Key': 'myAPIkey'
    }
    
    response = requests.request("POST", url, headers=headers, data = payload)
    
    print(response.text.encode('utf8'))
    

    【讨论】:

    • 谢谢,这确实返回了一些东西,虽然它似乎返回了一个 json 字符串
    • "输出用于创建具有指定 ID 的图形的数据" from devdocs.magento.com/mbi/docs/export-api.html#export-figure-data 这是你得到的 json 字符串吗?我认为要获取 csv,api 应该有一个 GET 请求
    • 是的,这是正在返回的 JSON
    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 2020-01-28
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多