如何正确执行 POST 请求?
How do I perform a POST request properly?
正在处理一个简单的 API。设法使 GET 和 DELETE 请求正常工作,但 POST 请求存在一些问题。很确定这是一个菜鸟错误,但我错过了这里的逻辑。
这是定义所有路由的文件。
import express from 'express';
import fs from 'fs';
const router = express.Router();
'use strict';
let rawdata = fs.readFileSync('api/resources/vehicles.json');
let vehicles = JSON.parse(rawdata);
let vehiclesArray = vehicles.vehicles;
let data = JSON.stringify(vehicles);
fs.writeFileSync('api/resources/vehicles.json', data);
router.get('/', (req, res, next) => {
res.status(200).json(vehiclesArray);
});
router.get('/:id', (req, res, next) => {
let id = req.params.id;
res.status(200).send(vehiclesArray[(id-1)]);
});
router.delete('/:id', (req, res, next) => {
let id = req.params.id;
const removedVehicle = vehiclesArray.splice(id, 1);
res.status(200).json({
message: `Vechicle ${removedVehicle} with id ${id} was removed`
});
});
router.post('/', (req, res, next) => {
let id = vehiclesArray.length + 1;
const vehicle = {
"id" : id,
"type" : req.params.type,
"brand" : req.params.brand,
"model" : req.params.model,
"production_year" : req.params.production_year,
"kilometers_driven" : req.params.kilometers_driven,
"price" : req.params.price
};
res.status(201).send({
message: `POSTed new vehicle: ${vehicle}`,
vehicle: vehicle
});
res.status(201).send(vehiclesArray.push(vehicle));
});
export default router;
在我的 POST 方法中,我定义了车辆,但是一旦我尝试发送它,我在 Postman 中得到以下信息,即确认添加的对象和对象,但只有 id 属性
有人可以给我一些提示,也许我做错了什么吗?我还需要 class 声明吗?谢谢!
看看the API documentation for params
:
This property is an object containing properties mapped to the named route “parameters”. For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.
现在看看你的路线。
router.post('/', (req, res, next) => {
你那里没有任何参数。所以这不是正确的事情。
现在看看您的 Postman 屏幕截图,您正在标签为 Body.
的选项卡上填写数据
返回 API 文档并浏览属性列表。
req.body
列在那里并说:
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().
因此设置一个 body-parsing 中间件,然后更改您正在发布的数据,使其实际上采用该格式(您的屏幕截图显示您正在输入 almost-but-not-quite-JSON 的原始数据,因此您需要解决这个问题),确保你进入 Headers 部分并设置 Content-Type
header 来描述你发送的格式,然后查看 req.body
而不是 req.params
.
根据@Quentin 的建议:
我安装了 body-parser 并将其包含在我的代码中。
import bodyParser from "body-parser";
router.use(express.json());
router.use(bodyParser.urlencoded({ extended: true }));
然后我在 post 函数体中将 req.param* 更改为 req.body*。
router.post('/:id', (req, res, next) => {
let id = vehiclesArray.length + 1;
const vehicle = {
"id" : id,
"type" : req.body.type,
"brand" : req.body.brand,
"model" : req.body.model,
"production_year" : req.body.production_year,
"kilometers_driven" : req.body.kilometers_driven,
"price" : req.body.price
};
res.status(201).send({vehicle: vehicle});
res.status(201).send(vehiclesArray.push(vehicle));
});
作为最后一步,我将 Postman 中的正文类型更改为 x-www-form-urlencoded。
POST 下面,localhost:3000/vehicles/:id
下面的 GET,只是为了检查是否确实添加了对象:
对我的努力也有帮助:
https://www.npmjs.com/package/body-parser
正在处理一个简单的 API。设法使 GET 和 DELETE 请求正常工作,但 POST 请求存在一些问题。很确定这是一个菜鸟错误,但我错过了这里的逻辑。
这是定义所有路由的文件。
import express from 'express';
import fs from 'fs';
const router = express.Router();
'use strict';
let rawdata = fs.readFileSync('api/resources/vehicles.json');
let vehicles = JSON.parse(rawdata);
let vehiclesArray = vehicles.vehicles;
let data = JSON.stringify(vehicles);
fs.writeFileSync('api/resources/vehicles.json', data);
router.get('/', (req, res, next) => {
res.status(200).json(vehiclesArray);
});
router.get('/:id', (req, res, next) => {
let id = req.params.id;
res.status(200).send(vehiclesArray[(id-1)]);
});
router.delete('/:id', (req, res, next) => {
let id = req.params.id;
const removedVehicle = vehiclesArray.splice(id, 1);
res.status(200).json({
message: `Vechicle ${removedVehicle} with id ${id} was removed`
});
});
router.post('/', (req, res, next) => {
let id = vehiclesArray.length + 1;
const vehicle = {
"id" : id,
"type" : req.params.type,
"brand" : req.params.brand,
"model" : req.params.model,
"production_year" : req.params.production_year,
"kilometers_driven" : req.params.kilometers_driven,
"price" : req.params.price
};
res.status(201).send({
message: `POSTed new vehicle: ${vehicle}`,
vehicle: vehicle
});
res.status(201).send(vehiclesArray.push(vehicle));
});
export default router;
在我的 POST 方法中,我定义了车辆,但是一旦我尝试发送它,我在 Postman 中得到以下信息,即确认添加的对象和对象,但只有 id 属性
有人可以给我一些提示,也许我做错了什么吗?我还需要 class 声明吗?谢谢!
看看the API documentation for params
:
This property is an object containing properties mapped to the named route “parameters”. For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.
现在看看你的路线。
router.post('/', (req, res, next) => {
你那里没有任何参数。所以这不是正确的事情。
现在看看您的 Postman 屏幕截图,您正在标签为 Body.
的选项卡上填写数据返回 API 文档并浏览属性列表。
req.body
列在那里并说:
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().
因此设置一个 body-parsing 中间件,然后更改您正在发布的数据,使其实际上采用该格式(您的屏幕截图显示您正在输入 almost-but-not-quite-JSON 的原始数据,因此您需要解决这个问题),确保你进入 Headers 部分并设置 Content-Type
header 来描述你发送的格式,然后查看 req.body
而不是 req.params
.
根据@Quentin 的建议: 我安装了 body-parser 并将其包含在我的代码中。
import bodyParser from "body-parser";
router.use(express.json());
router.use(bodyParser.urlencoded({ extended: true }));
然后我在 post 函数体中将 req.param* 更改为 req.body*。
router.post('/:id', (req, res, next) => {
let id = vehiclesArray.length + 1;
const vehicle = {
"id" : id,
"type" : req.body.type,
"brand" : req.body.brand,
"model" : req.body.model,
"production_year" : req.body.production_year,
"kilometers_driven" : req.body.kilometers_driven,
"price" : req.body.price
};
res.status(201).send({vehicle: vehicle});
res.status(201).send(vehiclesArray.push(vehicle));
});
作为最后一步,我将 Postman 中的正文类型更改为 x-www-form-urlencoded。
POST 下面,localhost:3000/vehicles/:id
下面的 GET,只是为了检查是否确实添加了对象:
对我的努力也有帮助: https://www.npmjs.com/package/body-parser