用Python发送JSON请求

27 投票
3 回答
87425 浏览
提问于 2025-04-17 09:01

我刚接触网络服务,想用一个Python脚本发送下面这个基于JSON的请求:

http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx&json={power:290.4,temperature:19.4}

如果我把上面的内容粘贴到浏览器里,它能正常工作。但是,我在用Python发送请求时遇到了困难。以下是我尝试的代码:

import json
import urllib2
data = {'temperature':'24.3'}
data_json = json.dumps(data)
host = "http://myserver/emoncms2/api/post"
req = urllib2.Request(host, 'GET', data_json, {'content-type': 'application/json'})
response_stream = urllib2.urlopen(req)
json_response = response_stream.read()

我该怎么把apikey的数据加到请求里呢?

谢谢!

3 个回答

3

可能问题出在 json.dumps 这个函数上,它会在生成的 JSON 数据中加上 " 符号,而你在网址中放的 JSON 数据里没有这些 " 符号。

举个例子:

data = {'temperature':'24.3'}
print json.dumps(data)

打印出来的是:

{"temperature": "24.3"}

而不是:

{temperature: 24.3}

就像你在网址中放的那样。

解决这个问题的一种方法(虽然可能会出错)是这样做:

json.dumps(data).replace('"', '')
7

虽然这并没有直接回答提问者的问题,但这里值得一提的是,requests模块有一个json选项,可以这样使用:

import requests

requests.post(
    'http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx',
    json={"temperature": "24.3"}
)

这相当于用curl命令来做的事情:

curl 'http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx' \
    -H 'Content-Type: application/json' \
    --data-binary '{"temperature":"24.3"}'

41

与其使用urllib2,不如试试requests这个库。这个新的Python库写得非常好,用起来更简单、更直观。

要发送你的json数据,你可以使用类似下面的代码:

import json
import requests
data = {'temperature':'24.3'}
data_json = json.dumps(data)
payload = {'json_payload': data_json, 'apikey': 'YOUR_API_KEY_HERE'}
r = requests.get('http://myserver/emoncms2/api/post', data=payload)

然后你可以查看r,从中获取HTTP状态码、内容等信息。

撰写回答