【问题标题】:Flask doesn't see JSON data sent by NodeFlask 看不到 Node 发送的 JSON 数据
【发布时间】:2017-01-16 16:09:38
【问题描述】:

我正在尝试使用 Node 将 JSON 数据发送到 Flask,但我无法读取 Flask 中的数据。我尝试在 Flask 中打印request.data,但它没有输出任何内容。我也尝试打印request.json,但它返回了 400 响应。为什么 Flask 看不到 Node 发送的 JSON 数据?

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) => {});

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"

Python 的输出:

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

已编辑以更新所有代码。

卷曲:

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

【问题讨论】:

  • 如果你使用http://httpbin.org/post,你会得到一个与你发送的内容相呼应的JSON响应;您将获得相同的结果(POST 正文中没有发送任何内容)。
  • 啊,我知道它在哪里写 JSON 化的正文了。但是,我没有看到任何 Content-Length 标头被设置;查看node.js http.request() documentation,他们在代码中明确设置了该标头。
  • @MartijnPieters:设置与否Content-Length不会改变任何东西,你确定http://httpbin.org/post的url吗?我得到ADDRNOTFOUND
  • 如果你卷曲怎么办?
  • @hjpotter92:与 node.js 版本相同的错误。但是,POSTMan 确实可以工作。

标签: javascript python json node.js flask


【解决方案1】:

Python 服务器很好,运行正常,问题在于手工制作的 http 请求,由于某种原因格式错误。

使用request 模块有效:

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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2017-06-10
    • 2013-10-29
    • 1970-01-01
    • 2018-07-21
    • 2022-08-19
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多