我正在尝试使用Angular2 POST向我的Python / Tornado后端发送一个参数,该后端返回一个JSON对象。参数正在正确发送,但在Python端,它返回400 POST缺少参数错误。我在前端和Python / Tornado服务器中使用Ionic 2 / Angular2。
Angular2代码如下: 这里的内容是一个包含HTML表的变量
let body = JSON.stringify({content: content});
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
this.http.post(url, body, options).map(res => res.json()).subscribe(data => {
console.log(data)
}, error => {
console.log(JSON.stringify(error));
});
Python代码如下:
def post(self):
print self.request.arguments
print self.get_argument('content')
self.finish(dict(result="ok", data=content))
这是错误:
[W 160824 06:04:30 web:1493] 400 POST /test (182.69.5.99): Missing argument content
[W 160824 06:04:30 web:1908] 400 POST /test (182.69.5.99) 1.67ms
答案 0 :(得分:0)
您的Angular2代码看起来很合理,但是您的Python代码是错误的,因为您将请求视为x-www-form-urlencoded。您必须通过request.body属性访问JSON字符串:
data = tornado.escape.json_decode(self.request.body)
有关类似问题的答案,请参阅https://stackoverflow.com/a/28140966/2380400。
答案 1 :(得分:0)
您应该尝试使用带有URLencoded内容类型的URLSearchParams()。我不太了解龙卷风,但我使用的是ASP控制器,它运行正常。
请参阅Angular2文档:https://angular.io/docs/ts/latest/api/http/index/URLSearchParams-class.html
观看我正在使用的以下身份验证示例:
controllerURL: string = "/APIConnexion";
login(aLogin: string, aMdp: string) {
// parameters definition (has to have the same name on the controller)
let params = new URLSearchParams();
params.set("aLogin", aLogin);
params.set("aMdp", aMdp);
// setup http request
let lHttpRequestBody = params.toString();
let lControllerAction: string = "/connexion";
let lControllerFullURL: string = this.controllerURL + lControllerAction;
let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
let options = new RequestOptions({ headers: headers });
// call http
return this.http.post(lControllerFullURL, lHttpRequestBody, options)
.map((res: any) => {
// data received as JSON
let data = res.json();
// Do something with your data
}
).catch(this.handleError);
}