瓶子 request.json 在帖子中获得 405
Posted
技术标签:
【中文标题】瓶子 request.json 在帖子中获得 405【英文标题】:bottle request.json getting a 405 on post 【发布时间】:2012-09-15 12:36:14 【问题描述】:我正在尝试让瓶子在 xmlhttprequest 中接收 json,但出现 405 错误
我的瓶子脚本的一部分:
@app.route('/myroute/')
def myroute():
print request.json
我测试 xhr 的其他脚本的一部分:
jdata = json.dumps("foo":"bar")
urllib2.urlopen("http://location/app/myroute/", jdata)
为什么我会收到 405?
bottlepy error: 127.0.0.1 - - [2012-09-23 23:09:34] "POST /myroute/ HTTP/1.0" 405 911 0.005458
urllib2 error: urllib2.HTTPError: HTTP Error 405: Method Not Allowed
我还尝试了以下变体:
@app.route('/myroute/json:json#[1-9]+#')
def myroute(json):
request.content_type = 'application/json'
print request.json, json
返回 json 似乎不是问题
【问题讨论】:
【参考方案1】:我认为问题在于服务器不允许 POST 请求。您可以尝试在 GET 请求中发送它:
urllib2.urlopen("http://location/app/myroute/?" + jdata)
更新:
我刚刚意识到,在再次查看您的问题后,您实际上是在尝试通过 GET 请求发送 JSON 数据。一般来说,您应该避免使用 GET 请求发送 JSON,而是使用 POST 请求[Reference]。
要向Bottle发送POST请求,还需要set the headers to application/json
:
headers =
headers['Content-Type'] = 'application/json'
jdata = json.dumps("foo":"bar")
urllib2.urlopen("http://location/app/myroute/", jdata, headers)
然后,借助@Anton 的回答,您可以像这样访问视图中的 JSON 数据:
@app.post('/myroute/')
def myroute():
print request.json
另外,作为奖励,发送一个普通的 GET 请求并访问它:
# send GET request
urllib2.urlopen("http://location/app/myroute/?myvar=" + "test")
# access it
@app.route('/myroute/')
def myroute():
print request.GET['myvar'] # should print "test"
【讨论】:
感谢您的帮助,这两个答案都是正确的!我仍然无法让 request.json 显示任何内容,但至少服务器没有出现故障。 @scape 我已经更新了我的答案,希望它能回答你的问题 :) 是的,我也意识到我需要在 urllib2 中设置标题,所以我按照您的建议进行了发布并添加了标题。感谢您的跟进!【参考方案2】:默认情况下,route
装饰器使装饰函数只处理 GET 请求。你需要添加一个method
参数来告诉Bottle 来处理POST 请求。为此,您需要进行更改:
@app.route('/myroute/')
到:
@app.route('/myroute/', method='POST')
或更短的版本:
@app.post('/myroute/')
【讨论】:
以上是关于瓶子 request.json 在帖子中获得 405的主要内容,如果未能解决你的问题,请参考以下文章
Grails 命令对象:如何将 request.JSON 加载到其中?