Angular2中的Http post请求不传递参数

时间:2016-08-24 06:12:38

标签: json post angular typescript

我正在尝试使用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

2 个答案:

答案 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);
    }