使用我的 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 请求应该导致 404410.

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' 用于他们自己的协议。