2016-08-24 34 views
0

Angular2 POSTを使用してJSONオブジェクトを返すPython/Tornadoバックエンドにパラメータを送信しようとしています。パラメータは正しく送信されていますが、Python側では、POSTの引数が足りない400のエラーを返しています。私は、フロントエンドとPython/TornadoサーバーでIonic 2/Angular2を使用しています。次のようにAngular2のHttp投稿要求がパラメータを渡しません

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

をあなたは、コンテンツがあなたのjsのコードスニペットの前に、未定義ではありませんか? –

+0

'let body = JSON.stringify({content:content || '}}')を実行するとどうなりますか? –

答えて

0

あなたのAngular2コードは合理的ですが、あなたのPythonコードは間違っています。リクエストをx-www-form-urlencodedとして扱っています。あなたはrequest.bodyプロパティを介してJSON文字列にアクセスする必要があります。

data = tornado.escape.json_decode(self.request.body) 

は、同様の質問への答えをhttps://stackoverflow.com/a/28140966/2380400を参照してください。

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); 
    } 
関連する問題