首页 > 解决方案 > 在请求库中传递 curl -d 参数时出错

问题描述

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

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

我的目标是在Python中使用requests. 当我输入与 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 请求的任何帮助将不胜感激

标签: pythoncsvcurlpython-requests

解决方案


在这里你传递一个集合,你应该传递一个 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'))

推荐阅读