使用我的 REST API 继续收到 DELETE 400(错误请求)
Keep getting a DELETE 400 (Bad Request) with my REST API
所以,我创建了一个 API 并且我的 POST 和 GET 请求可以正常工作,但是我无法让 DELETE 请求正常工作。我不断在控制台中收到 'DELETE http://localhost:3000/api 400 (Bad Request)' 错误。
这是我的服务器文件中的删除部分:
app.delete('/api', (request, response) => {
database.remove({ _id: request }, {}, function(err, numRemoved) {});
});
这是执行删除的按钮:
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', options);,但我不知道如何解决它!谁能帮帮我?
我看不到 uid
的设置位置。但是,根据您的错误消息,我认为 uid
不是有效的 JSON 对象。您可以将 uid
放入像 { uid }
这样的对象中。然后,使用 request.body.uid
.
读取路由处理程序中的对象
此外,在传统的 REST API 中,DELETE 请求没有正文。相反,您的路线将采用 /api/:id
的格式。您的请求 url 然后需要更新为 "/api/" + uid
。然后,您可以使用 req.params.id
.
在路由处理程序中读取请求参数
错误可能是由于删除请求不应接收 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);
};
});
我觉得这可能源于对 DELETE
请求的用途的误解。
DELETE
方法的主要目标是删除 uri 处的资源。例如,/article/123
上的 DELETE
会删除 /article/123
处的资源,这意味着将来在该位置的 GET
请求应该导致 404
或410
.
在 DELETE
请求中使用 body 是没有意义的,因为如果请求的目的是删除 URI 中的资源,那么 body 中没有任何内容确实进一步修改了请求的含义。 HTTP 规定 DELETE
(以及 GET
和其他)不应该有 body.
所以你提出的请求是DELETE /api
,意思是“删除/api资源”。 body 无关紧要(并导致您的错误)。
看来您想要更多 RPC-style API。如果你只使用 /api
端点,你可能应该忘记所有的方法而只使用 POST
。你不是真的在做 REST。
如果您想要应用更多设计并使用适当的 HTTP 方法,您应该首先考虑路由的结构。请记住,该方法描述了您正在执行的操作类型,而 URI 描述了您正在执行该操作的对象。将 API 设计为通过单个端点(例如使用 GraphQL 和 SOAP)的人有效地将 HTTP 作为 'tunnel' 用于他们自己的协议。
所以,我创建了一个 API 并且我的 POST 和 GET 请求可以正常工作,但是我无法让 DELETE 请求正常工作。我不断在控制台中收到 'DELETE http://localhost:3000/api 400 (Bad Request)' 错误。
这是我的服务器文件中的删除部分:
app.delete('/api', (request, response) => {
database.remove({ _id: request }, {}, function(err, numRemoved) {});
});
这是执行删除的按钮:
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', options);,但我不知道如何解决它!谁能帮帮我?
我看不到 uid
的设置位置。但是,根据您的错误消息,我认为 uid
不是有效的 JSON 对象。您可以将 uid
放入像 { uid }
这样的对象中。然后,使用 request.body.uid
.
此外,在传统的 REST API 中,DELETE 请求没有正文。相反,您的路线将采用 /api/:id
的格式。您的请求 url 然后需要更新为 "/api/" + uid
。然后,您可以使用 req.params.id
.
错误可能是由于删除请求不应接收 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);
};
});
我觉得这可能源于对 DELETE
请求的用途的误解。
DELETE
方法的主要目标是删除 uri 处的资源。例如,/article/123
上的 DELETE
会删除 /article/123
处的资源,这意味着将来在该位置的 GET
请求应该导致 404
或410
.
在 DELETE
请求中使用 body 是没有意义的,因为如果请求的目的是删除 URI 中的资源,那么 body 中没有任何内容确实进一步修改了请求的含义。 HTTP 规定 DELETE
(以及 GET
和其他)不应该有 body.
所以你提出的请求是DELETE /api
,意思是“删除/api资源”。 body 无关紧要(并导致您的错误)。
看来您想要更多 RPC-style API。如果你只使用 /api
端点,你可能应该忘记所有的方法而只使用 POST
。你不是真的在做 REST。
如果您想要应用更多设计并使用适当的 HTTP 方法,您应该首先考虑路由的结构。请记住,该方法描述了您正在执行的操作类型,而 URI 描述了您正在执行该操作的对象。将 API 设计为通过单个端点(例如使用 GraphQL 和 SOAP)的人有效地将 HTTP 作为 'tunnel' 用于他们自己的协议。