我正在尝试在python中执行curl请求。我的代码如下:
url = 'http://xx.xxx.xx.xxx:xxxx/api/common/learningSessions/588752bef1d4654173a43015'
payload = json.loads(open("request.json"))
headers = {'X-User-Path': '....', 'X-User-Token': '...')
r = requests.get(url, data=json.dumps(payload), headers=headers)
我在第二行收到以下错误:
TypeError:期望的字符串或缓冲区(payload = json.loads(open(" request.json")))
知道这个错误是什么意思吗?
答案 0 :(得分:3)
预期的字符串或缓冲区
open()返回一个文件。
json.load()
和json.loads()
之间存在差异(第二个接受字符串,而不是文件)
此外,我不认为json.dumps()
是必要的
答案 1 :(得分:3)
您正在打开文件open("request.json")
,这将返回<open file 'request.json', mode 'r' at 0x108526810>
。
json.loads
需要字符串。
你可以尝试
url = 'http://xx.xxx.xx.xxx:xxxx/api/common/learningSessions/588752bef1d4654173a43015'
payload = json.loads(open("request.json").read())
headers = {'X-User-Path': '....', 'X-User-Token': '...')
r = requests.post(url, data=json.dumps(payload), headers=headers)
file.read
将返回文件内容而不是文件对象。
如果您不想使用read
,可以直接使用json.load
代替json.loads
这就是我试过的
echo '{}' > /tmp/test.json
cat /tmp/test.json
{}
尝试阅读相同的文件。
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> payload = json.loads(open("/tmp/test.json").read())
>>> print payload
{}
答案 2 :(得分:2)
您正在使用json.loads()
但尝试加载文件。您需要改为使用json.load()
。
payload = json.load(open("request.json"))