所以,我已经创建了一个API,并且我的帖子和请求都可以工作,但是我无法让删除请求工作。我一直在控制台中得到一个'DELETE http://localhost:3000/api 400 (坏请求)‘错误。
以下是我的服务器文件中的删除部分:
app.delete('/api', (request, response) => {
database.remove({ _id: request }, {}, function(err, numRemoved) {});
});
下面是执行DELETE的按钮:
document.body.addEventListener('click', function(event) {
if (event.target.id == uid) {
const options = {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
},
body: uid
};
fetch('/api', options);
};
});
它说坏的请求来自fetch('/api',选项);,但是我不知道如何修复它!有谁可以帮我?
发布于 2021-10-28 22:37:06
错误可能是由于delete请求不应该接收json主体,您应该将uid作为路径变量传递,如下所示:
app.delete('/api/:uid', (request, response) => {
const uid = request.params.uid;
database.remove({ _id: uid }, {}, function(err, numRemoved) {});
});
并将你的电话改为:
document.body.addEventListener('click', function(event) {
if (event.target.id == uid) {
const options = {
method: 'DELETE',
};
const endpoint = `/api/${uid}`;
fetch(endpoint, options);
};
});
发布于 2021-10-28 23:12:46
我认为这可能源于对DELETE
请求的误解。
DELETE
方法的主要目标是删除uri中的资源。例如,DELETE
on /article/123
删除/article/123
上的资源,这意味着将来在该位置的GET
请求应该导致404
或410
。
在DELETE
请求中有一个主体是没有意义的,因为如果请求的目的是删除URI中的资源,那么正文中的任何内容都不会进一步修改请求的含义。HTTP命令DELETE
(以及GET
和其他人)不应该有一个身体。
所以您提出的请求是DELETE /api
,意思是“删除/api资源”。身体是不相关的(并导致你的错误)。
看起来,您需要更多的RPC风格的API。如果您只使用/api
端点,您可能应该忘记所有的方法,而只使用POST
。你不是真的在休息。
如果您确实希望应用更多的设计和使用适当的HTTP方法,那么您应该首先考虑路由是如何构造的。请记住,该方法描述您正在执行的操作类型,URI描述您正在执行的操作。设计API以通过单个端点(例如使用GraphQL和SOAP)的人有效地使用HTTP作为自己协议的“隧道”。
发布于 2021-10-28 22:26:14
我不知道uid
是在哪里设置的。但是,根据您的错误消息,我假设uid
不是一个有效的JSON对象。您可以将uid
放到像{ uid }
这样的对象中。然后,使用request.body.uid
读取路由处理程序中的对象。
另外,在传统的REST中,删除请求没有主体。相反,您的路由将采用/api/:id
格式。然后,您的请求url将需要更新为"/api/" + uid
。然后,您可以使用req.params.id
在路由处理程序中读取请求参数。
https://stackoverflow.com/questions/69761580
复制相似问题