用Python发送JSON请求

用Python发送JSON请求,python,json,Python,Json,我是web服务新手,正在尝试使用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_

我是web服务新手,正在尝试使用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数据添加到请求中


谢谢大家!

您可以使用。这个新的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状态代码、内容等

可能问题在于
json.dumps
put
而在您放入url的json中没有
s。 例如:

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

{“温度”:“24.3”}

而不是:

{温度:24.3}

就像你把你的网址

解决此问题的一种方法(容易出现故障)是:

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

尽管这并不能完全回答OPs问题,但这里应该提到,
请求
模块有一个
json
选项,可以这样使用:

导入请求
请求发送(
'http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx',
json={“温度”:“24.3”}
)
这相当于旋度:

curl'http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx' \
-H'内容类型:应用程序/json'\
--数据二进制“{”温度“:“24.3”}”

感谢您的回复!是否有一种方法可以用于打印实际的get请求字符串?服务器以“需要有效的写入apikey”进行响应,但我使用的是在浏览器中工作的同一个密钥。是的,您可以使用事件挂钩进行响应。实际上,requests文档包含一个示例,在发送请求之前打印url:Hi Simao,这使我能够查看参数,但是我需要做什么才能看到发送到服务器的实际完整请求字符串,例如,{power:290.4,temperature:19.4}OK,当我发现如何查看细节请求时,我需要重定向到stdout。我尝试使用文档中描述的挂钩,似乎数据正在发送。请注意,传递给回调函数的
args
变量包含的不仅仅是url,它是一个完整的Requests GET对象。另外,在你最初的帖子中,你提到你试图获取你的资源,但在你的最后一行日志中,你显示了一个帖子请求。谢谢你的回复。我已经测试过在浏览器中发送请求,并在键和值周围加上引号,它仍然可以正常工作。我似乎遇到的主要问题是,我的python脚本没有正确发送apikey数据。将代码更改为:
params=urllib.urlencode({'apikey':'xxxxxxx','json':{'temperature':'24.3'}})\urllib2.urlopen(host+'?'+params)怎么样
应该注意的是,requests json选项将数据包含在请求体中,而不是直接包含在URI中。