【发布时间】:2018-08-25 16:40:37
【问题描述】:
从客户端,我正在使用 jquery 发出“删除”类型的 Ajax 请求。在服务器端,我正在执行 res.redirect(URL)。但是浏览器不是重定向,而是再次发出删除请求从服务器端返回的用于重定向的 URL。 但是,发布请求不会发生这种情况。发布请求一切正常。
【问题讨论】:
标签: ajax express http-delete
从客户端,我正在使用 jquery 发出“删除”类型的 Ajax 请求。在服务器端,我正在执行 res.redirect(URL)。但是浏览器不是重定向,而是再次发出删除请求从服务器端返回的用于重定向的 URL。 但是,发布请求不会发生这种情况。发布请求一切正常。
【问题讨论】:
标签: ajax express http-delete
短版
Ajax 正试图按照请求进行到底以获得成功的响应 (2xx)。如果您想删除资源并将用户发送到新网页,则需要在收到 Ajax 调用的成功响应后进行处理。
完整解释
虽然有时会在处理请求(例如登录成功/失败)后使用重定向,但这并不是它们的真正用途。通常,您只会将用户重定向到他们正在寻找的资源。例如,您可以将POST /blog-post 等端点移动到POST /blog-article 的新位置。您在这里对请求者说的是,某些东西曾经在它所在的位置,但现在他们需要在其他地方提出请求才能找到他们想要的东西。这在尝试阻止 link rot 时非常重要。
接受和处理请求,然后将用户转移到另一个页面的想法实际上更多的是巧合。由于浏览器处理 URL 请求的方式,它恰好可以工作。
我希望您的 POST 请求实际上使用了一个表单,在这种情况下,浏览器正在跟踪重定向,因为它收到了类似 301 的信息并试图查看请求链。但是,当使用 Ajax 时,重定向是由 Ajax 调用本身而不是整个浏览器处理的。在这种情况下,Ajax 的行为就像您期望端点已被移动一样。因此,例如,如果您在服务器端移动端点,您的应用程序仍将按照重定向指令运行。
您真正需要做的是向您的 Ajax 调用返回一个成功的响应,例如 204(无内容),然后在您的前端将用户移至新页面。
我承认这并不方便,但是当您了解重定向实际存在的原因时,它就更有意义了。它们不是告诉用户转移到其他东西的一种方式,它们是一种试图防止链接失效并使应用程序能够继续使用可能略有变化的 API 的方式。
【讨论】: