Nodejs rest post json(非表单方式) 的问题请教

Nodejs rest post json(非表单方式) 的问题请教

初学node,想基于node开放一个rest api,但是使用第三方应用向这个API post数据时取不到数据。以下的Demo主要部份(基于Express),demo单纯了为测试非form方式post数据时能否接收:

app.post('/postJsonTest', function(req, res){  
    res.set({'Content-Type':'text/json','Encodeing':'utf8'});
    var content= req.body;
    console.log(content);

//若是非form方式提交,这里就会为: {}

})

然后我用chrome postman post Raw(json)方式post 以下json: { “Id” : 1, “content”:‘asdasdasdasdasd’ }

node此时接收到的是:{}; 切换用form方式提交 node 就可以正常用req.body 取得post过来的数据;

非form方式,request header为 request payload; 是不是不能用 req.body接收非form post过来的数据还是怎么样,请各位大神指教下,谢谢!


3 回复

当然,我可以帮助你解决这个问题。在处理非表单形式的 JSON 数据时,你需要确保正确地配置中间件来解析请求体中的 JSON 数据。在 Express 中,你可以使用 body-parser 或者直接使用 Express 内置的中间件来处理 JSON 数据。

示例代码

首先,确保你已经安装了必要的依赖项。如果你还没有安装 expressbody-parser,可以通过以下命令进行安装:

npm install express body-parser

接下来,创建一个简单的 Express 应用来处理 POST 请求,并解析 JSON 数据。

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

// 使用body-parser中间件来解析JSON格式的请求体
app.use(bodyParser.json());

app.post('/postJsonTest', (req, res) => {
    // 设置响应头
    res.set({'Content-Type': 'application/json', 'Encoding': 'utf8'});

    // 获取请求体中的JSON数据
    const content = req.body;

    // 打印接收到的数据
    console.log(content);

    // 返回接收到的数据作为响应
    res.send({ received: content });
});

// 启动服务器
const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

解释

  1. 引入依赖

    • 引入 expressbody-parser
  2. 使用中间件

    • app.use(bodyParser.json()); 这行代码会将 body-parser 配置为解析 JSON 格式的请求体。
  3. 处理POST请求

    • /postJsonTest 路径上处理 POST 请求。
    • 使用 req.body 来访问请求体中的 JSON 数据。
    • 打印接收到的数据到控制台。
    • 将接收到的数据作为 JSON 响应返回给客户端。
  4. 启动服务器

    • 监听指定端口(默认为 3000)。

使用 Postman 测试

  1. 打开 Postman。
  2. 选择 POST 方法。
  3. 输入 URL:http://localhost:3000/postJsonTest
  4. 在 Body 标签下选择 raw 并选择 JSON 类型。
  5. 输入以下 JSON 数据:
    {
        "Id": 1,
        "content": "asdasdasdasdasd"
    }
    
  6. 发送请求并查看控制台输出以及 Postman 的响应。

这样配置后,你应该能够正确地接收和处理非表单形式的 JSON 数据。希望这能解决你的问题!


。。。呃,不用expresion这样子实现还行,但express的实现方式应该要怎么写?

(非express 实现): var http = require(‘http’);

function start() { function onRequest(request, response) { //var urlPath = url.parse(request.url).pathname; if (request.method == ‘POST’) { request.setEncoding(‘utf8’);

var postData = ‘’; request.addListener(“data”, function(postDataChunk) { postData += postDataChunk; console.log(“Received POST data chunk '” + postDataChunk + “’.”); });

request.addListener(“end”, function() { var c = postData; console.log©; }); } } http.createServer(onRequest).listen(8080); console.log(‘Service is started listen 8080!’); } start();

当你使用非表单方式(如JSON)POST数据到Node.js应用时,需要确保你的应用能够解析请求体中的JSON数据。默认情况下,Express框架并不具备这种能力,你需要使用中间件来处理这种场景。最常用的是body-parser或Express 4.16版本以后内置的express.json()中间件。

示例代码

首先,确保你已经安装了expressexpress.json()

npm install express

然后,在你的Express应用中配置express.json()中间件:

const express = require('express');
const app = express();

// 解析JSON格式的请求体
app.use(express.json());

app.post('/postJsonTest', function(req, res){
    // 现在req.body应该包含解析后的JSON数据
    var content = req.body;
    console.log(content); // 应该输出 { Id: 1, content: 'asdasdasdasdasd' }

    res.send({ message: 'Data received correctly!' });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 引入中间件:通过express.json()来解析传入的JSON数据。
  2. 使用中间件:通过app.use(express.json())将其添加到中间件链中,这样所有后续的路由都可以访问到解析过的req.body对象。
  3. 接收数据:当客户端POST JSON数据时,Express会自动解析这些数据,并将其填充到req.body属性中。

使用上述配置后,当你通过Postman或其他工具发送JSON数据到/postJsonTest端点时,Express将正确地解析这些数据并存储在req.body中,从而允许你访问这些数据。

回到顶部