【问题标题】:Keep getting a DELETE 400 (Bad Request) with my REST API使用我的 REST API 不断收到 DELETE 400(错误请求)
【发布时间】:2021-12-14 02:21:06
【问题描述】:

所以,我创建了一个 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);,但我不知道如何解决它!谁能帮帮我?

【问题讨论】:

  • 您可以看到服务器端发生的错误吗?

标签: javascript rest express http-delete nedb


【解决方案1】:

我觉得这可能源于对 DELETE 请求的用途的误解。

DELETE 方法的主要目标是删除 uri 处的资源。例如,/article/123 上的 DELETE 会删除 /article/123 处的资源,这意味着该位置的未来 GET 请求应导致 404410

DELETE 请求中包含正文永远没有意义,因为如果请求的目的是删除 URI 处的资源,则正文中的任何内容都不会真正进一步修改请求的含义。 HTTP 规定 DELETE(以及 GET 和其他人)不应该有正文。

所以你发出的请求是DELETE /api,意思是“删除/api资源”。正文无关紧要(并导致您的错误)。

看起来您要使用更多 RPC 样式的 API。如果您只使用/api 端点,您可能应该忘记所有方法,只使用POST。你并没有真正在做 REST。

如果您确实想要应用更多设计并使用适当的 HTTP 方法,则应首先考虑路由的结构。请记住,该方法描述了您正在执行的操作类型,而 URI 描述了您正在执行该操作的内容。将 API 设计为通过单个端点(例如使用 GraphQL 和 SOAP)的人有效地将 HTTP 用作他们自己协议的“隧道”。

【讨论】:

  • 感谢您花时间给我深入的解释!
【解决方案2】:

这个错误可能是因为删除请求不应该收到一个json body,你应该把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);
        };
    });

【讨论】:

    【解决方案3】:

    我看不到uid 的设置位置。但是,根据您的错误消息,我假设 uid 不是有效的 JSON 对象。您可以将uid 放入像{ uid } 这样的对象中。然后,使用request.body.uid 读取路由处理程序中的对象。

    此外,在传统的 REST API 中,DELETE 请求没有正文。相反,您的路线将采用/api/:id 的格式。然后,您的请求 URL 需要更新为 "/api/" + uid。然后,您可以使用req.params.id 在您的路由处理程序中读取请求参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多