2016-09-08 5 views
3

Ich versuche, JSON-Daten zu senden Knoten Flask, aber ich kann die Daten in Flask nicht lesen. Ich habe versucht, request.data in Flask zu drucken, aber es gab nichts aus. Ich versuchte auch, request.json zu drucken, aber es gab eine Antwort 400 zurück. Warum sieht Flask die von Node gesendeten JSON-Daten nicht?Flask nicht JSON-Daten durch den Knoten gesendet sehen

from flask import Flask 
from flask import request 

app = Flask(__name__) 

@app.route("/", methods=['GET', 'POST']) 
def hello(): 
    if request.method == "POST": 
     print "POST"; 
     print "get_json: ", request.get_json(); 
     # print "get_json: ", request.get_json(force = True); 
     print "data: ", request.data; 
     return 'POST'; 
    else: 
     print "GET"; 
     return "GET"; 

if __name__ == "__main__": 
    app.run() 
var async = require('async'), 
    http = require('http'), 
    util = require('util'); 

var server = { 
     hostname: '127.0.0.1', 
     port: 5000 
    }; 

function request(method, path, headers, body, callback) { 
    var req = {}; 

    if(!headers) { 
     headers = {}; 
    } 

    headers['Content-Type'] = 'application/json'; 

    console.log(method + ' ' + path); 
    console.log(' Req:'); 
    console.log(' headers: ' + JSON.stringify(headers)); 
    if(body) { 
     console.log(' body : ' + JSON.stringify(body)); 
    } else { 
     console.log(' no body'); 
    } 

    req = http.request({ 
      hostname: server.hostname, 
      port: server.port, 
      path: path, 
      method: method, 
      headers: headers 
     }, (res) => { 
      var resbody = ''; 

      res.on('data', (chunk) => { 
       resbody = resbody + chunk; 
      }); 

      res.on('end',() => { 
       console.log(' Res:'); 
       console.log(' headers: ' + JSON.stringify(res.headers)); 
       if(body) { 
        console.log(' body : ' + JSON.stringify(resbody)); 
       } else { 
        console.log(' no body'); 
       }    
       callback(resbody); 
      }); 
     } 
    ); 

    req.on('error', (err) => { 
     console.log(method + ' ' + path + ' ERR: ' + util.inspect(err)); 
     callback(err); 
    }); 

    if(body) { 
     req.write(JSON.stringify(body)); 
    } 

    req.end(); 
} 

request('POST', '/', null, {foo: 'bar'}, (res) => {}); 

Ausgabe von JavaScript:

POST/
Req: 
    headers: {"Content-Type":"application/json"} 
    body : {"foo":"bar"} 
Res: 
    headers: {"content-type":"text/html","content-length":"192","server":"Werkzeug/0.11.11 Python/2.7.11","date":"Fri, 09 Sep 2016 10:29:58 GMT"} 
    body : "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a request that this server could not understand.</p>\n" 

Ausgabe von Python:

POST 
get_json: 127.0.0.1 - - [09/Sep/2016 12:29:58] "POST/HTTP/1.1" 400 - 

Edited Alle Codes aktualisieren.

curl:

> curl.exe 127.0.0.1:5000 --header "Content-Type: application/json" --data {\"foo\":\"bar\"} 
POST 
+0

Wenn Sie 'http verwenden waren: // httpbin.org/Post' würden Sie erhalten eine JSON-Antwort zurück, die Echos, was Sie geschickt; Sie erhalten die gleichen Ergebnisse (nichts wird im POST-Body gesendet). –

+0

Ah, ich sehe, wo es den JSonified-Körper schreibt. Ich sehe jedoch keinen Content-Length-Header, der gesetzt wird; mit Blick auf den [node.js 'http.request()' Dokumentation] (https://nodejs.org/api/http.html#http_http_request_options_callback) setzen sie in ihrem Code diesen Header explizit. –

+0

@davidism: Das gleiche Ergebnis, nichts wird gedruckt, und der Knoten erhält einen Fehler von 400. – DrakaSAN

Antwort

0

Der Python Server ist in Ordnung, und ordnungsgemäß ausgeführt werden, liegt das Problem in der handgearbeiteten http-Request, die aus irgendeinem Grund fehlerhaft ist.

das request Modul verwenden funktioniert:

var request = require('request'); 

request({ 
    method: 'POST', 
    url: 'http://127.0.0.1:5000', 
    // body: '{"foo": "bar"}' 
    json: {"foo": "bar"} 
}, (error, response, body) => { 
    console.log(error); 
    // console.log(response); 
    console.log(body); 
}); 
Verwandte Themen