如何在python 2.7 中的cherrypy 中接收JSON POST 请求数据
How to receive JSON POST request data in cherrypy in python 2.7
我正在尝试了解如何在 Python 2.7 中接收 JSON POST 数据
使用同时服务 html 和 json
的 cherrypy 安装
我正在使用此脚本发送演示 JSON 请求
import urllib2
import json
def mytest():
d = {
'hello': '1',
'world': '2'
}
print(json.dumps(d))
URL = 'http://localhost:8092/json_in'
print(URL)
post_data = json.dumps(d)
req = urllib2.Request(URL, post_data)
RESULT = urllib2.urlopen(req).read()
print(RESULT)
if __name__ == '__main__':
mytest()
cherrypy 的工作原理是这样的
# -*- coding: utf-8 -*-^
import cherrypy
class WelcomePage:
def index(self):
return "<html><body>hello world</body><html>"
index.exposed = True
def json_in(self,**kwargs):
print kwargs
# this is dumb but works to grab the first and only argument
for key,value in kwargs.iteritems():
myjson = key
parsed_json = json.loads(myjson)
print(parsed_json['hello'])
return "{}"
json_in.exposed = True
if __name__ == '__main__':
cherrypyconf = "cherrypy.conf"
cherrypy.quickstart(WelcomePage(),config=cherrypyconf)
当我启动服务器并发送请求时
我可以在领事馆看到我的请求(来自打印
命令)但字符串解析失败并出现错误
类型错误:预期的字符串或缓冲区
任何提示如何解决这个问题?
更新:
问题似乎是我没明白如何处理**kwargs。
更新后的代码有效(但使用了一种非常愚蠢的方式来提取
JSON 直到我找到正确的语法来获取第一个参数)
您没有利用 cherrypy 提供的一些内置工具,并且客户端代码没有指定正确的内容类型。
客户端代码应如下所示:(注意内容类型 header):
import urllib2
import json
def mytest():
d = {
'hello': '1',
'world': '2'
}
print(json.dumps(d))
URL = 'http://localhost:8092/json_in'
print(URL)
post_data = json.dumps(d)
req = urllib2.Request(URL, post_data, headers={
'Content-Type': 'application/json'
})
RESULT = urllib2.urlopen(req).read()
print(RESULT)
if __name__ == '__main__':
mytest()
你的服务器代码是这样的:
# -*- coding: utf-8 -*-
import cherrypy as cp
class WelcomePage:
@cp.expose
def index(self):
return "<html><body>hello world</body><html>"
@cp.expose
@cp.tools.json_in()
@cp.tools.json_out()
def json_in(self):
print(cp.request.json['hello'])
return {}
if __name__ == '__main__':
cherrypyconf = "cherrypy.conf"
cp.quickstart(WelcomePage(),config=cherrypyconf)
我正在尝试了解如何在 Python 2.7 中接收 JSON POST 数据 使用同时服务 html 和 json
的 cherrypy 安装我正在使用此脚本发送演示 JSON 请求
import urllib2
import json
def mytest():
d = {
'hello': '1',
'world': '2'
}
print(json.dumps(d))
URL = 'http://localhost:8092/json_in'
print(URL)
post_data = json.dumps(d)
req = urllib2.Request(URL, post_data)
RESULT = urllib2.urlopen(req).read()
print(RESULT)
if __name__ == '__main__':
mytest()
cherrypy 的工作原理是这样的
# -*- coding: utf-8 -*-^
import cherrypy
class WelcomePage:
def index(self):
return "<html><body>hello world</body><html>"
index.exposed = True
def json_in(self,**kwargs):
print kwargs
# this is dumb but works to grab the first and only argument
for key,value in kwargs.iteritems():
myjson = key
parsed_json = json.loads(myjson)
print(parsed_json['hello'])
return "{}"
json_in.exposed = True
if __name__ == '__main__':
cherrypyconf = "cherrypy.conf"
cherrypy.quickstart(WelcomePage(),config=cherrypyconf)
当我启动服务器并发送请求时 我可以在领事馆看到我的请求(来自打印 命令)但字符串解析失败并出现错误 类型错误:预期的字符串或缓冲区
任何提示如何解决这个问题?
更新:
问题似乎是我没明白如何处理**kwargs。 更新后的代码有效(但使用了一种非常愚蠢的方式来提取 JSON 直到我找到正确的语法来获取第一个参数)
您没有利用 cherrypy 提供的一些内置工具,并且客户端代码没有指定正确的内容类型。
客户端代码应如下所示:(注意内容类型 header):
import urllib2
import json
def mytest():
d = {
'hello': '1',
'world': '2'
}
print(json.dumps(d))
URL = 'http://localhost:8092/json_in'
print(URL)
post_data = json.dumps(d)
req = urllib2.Request(URL, post_data, headers={
'Content-Type': 'application/json'
})
RESULT = urllib2.urlopen(req).read()
print(RESULT)
if __name__ == '__main__':
mytest()
你的服务器代码是这样的:
# -*- coding: utf-8 -*-
import cherrypy as cp
class WelcomePage:
@cp.expose
def index(self):
return "<html><body>hello world</body><html>"
@cp.expose
@cp.tools.json_in()
@cp.tools.json_out()
def json_in(self):
print(cp.request.json['hello'])
return {}
if __name__ == '__main__':
cherrypyconf = "cherrypy.conf"
cp.quickstart(WelcomePage(),config=cherrypyconf)