4

我试图让瓶子在 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 似乎不是问题

4

2 回答 2

4

我认为问题是服务器不允许 POST 请求。您可能可以尝试在 GET 请求中发送它:

urllib2.urlopen("http://location/app/myroute/?" + jdata)

更新

我刚刚意识到,在再次查看您的问题后,您实际上是在尝试通过 GET 请求发送 JSON 数据。一般来说,您应该避免使用 GET 请求发送 JSON,而是使用 POST 请求[参考]。

要向 Bottle 发送 POST 请求,您还需要将标头设置为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"
于 2012-09-24T03:50:50.433 回答
3

默认情况下,route装饰器使装饰函数只处理 GET 请求。您需要添加一个method参数来告诉 Bottle 来处理 POST 请求。为此,您需要更改:

@app.route('/myroute/') 

到:

@app.route('/myroute/', method='POST')

或更短的版本:

@app.post('/myroute/')
于 2012-09-24T03:55:34.597 回答