我正在尝试将从client.py创建的python字典发送到我的webservice,让webservice对数据执行某些操作,并将一个布尔值返回给client.py。这是我到目前为止服务器和客户端的代码:
服务器端(在webservice.py内):
from flask import Flask
from flask import request
import json
app = Flask(__name__)
@app.route('/determine_escalation',methods = ['POST'])
def determine_escalation():
jsondata = request.form['jsondata']
data = json.loads(jsondata)
#stuff happens here that involves data to obtain a result
result = {'escalate':'True'}
return json.dumps(result)
if __name__ == '__main__':
app.run(debug=True)
客户端(在client.py内):
import sys
import json
import requests
conv = [{'input': 'hi', 'topic': 'Greeting'}]
s = json.dumps(conv)
res = requests.post("http://127.0.0.1:5000/determine_escalation",data=s)
print res.text
但是当我打印res.text时,我明白了:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>
我做错了什么,我该如何解决这个问题? Flask和JSON的新东西,所以任何帮助都是值得赞赏的。
答案 0 :(得分:6)
好的 - 这里有几个问题:
首先,您可以使用requests.get_json()在服务器端检索您的JSON数据:
from flask import Flask
from flask import request
import json
app = Flask(__name__)
@app.route('/determine_escalation/', methods = ['POST'])
def determine_escalation():
jsondata = request.get_json()
data = json.loads(jsondata)
#stuff happens here that involves data to obtain a result
result = {'escalate': True}
return json.dumps(result)
if __name__ == '__main__':
app.run(debug=True)
此外,当您将数据放在一起时,而不是使用“data = s”发送请求,请使用“json = s”:
import sys
import json
import requests
conv = [{'input': 'hi', 'topic': 'Greeting'}]
s = json.dumps(conv)
res = requests.post("http://127.0.0.1:5000/determine_escalation/", json=s).json()
print(res['escalate'])
请注意我在URL的末尾添加了斜杠 - 这只是一个好习惯: - )
我还整合了MarcelK建议的更改 - 从布尔值'True'(服务器端)删除引号,并使用.json()来解析客户端的响应 - 这些都是很好的建议。
我已经测试了这个修订版本(并重新修订版本),它运行正常。