为什么即使找不到任何资源,使用搜索参数发出 GET 请求也不会返回 404



我在尝试JavaScript的URL对象时遇到了这个奇怪的问题

以下是演示:https://codesandbox.io/s/fervent-wilbur-15kyt?file=/src/index.js

所以端点是https://jsonplaceholsdsdsdder.typicode.com/todos/,

密钥id可以是整数作为其值。所以https://jsonplaceholder.typicode.com/todos/?id=4有效。和https://jsonplaceholder.typicode.com/todos/?id=dsdsd无效。

我发现使用Fetch发出请求https://jsonplaceholder.typicode.com/todos/?id=4仍然会返回状态代码为200的响应。


const inputEl = document.querySelector("#input");
const endpoint = new URL("https://jsonplaceholder.typicode.com/todos/");
inputEl.addEventListener("input", async e => {
const { value: text } = e.target;
endpoint.searchParams.set("id", text);
const repsonse = await fetch(endpoint).catch(console.error);
const data = await repsonse.json();
console.log(repsonse.status); // 200
console.log(data); // []
});

但是,如果我们像这样直接构建URLhttps://jsonplaceholsdsdsdder.typicode.com/todos/dd。这实际上将返回一个带有404状态代码的响应。

搜索参数不是资源位置的一部分。它们是可选的,必须由处理请求的服务器手动访问。

https://jsonplaceholder.typicode.com/todos/是由jsonplaceholder.com设置的有效资源位置。

https://jsonplaceholder.typicode.com/todos/?id=4是有效的资源位置,因为问号(?(之后的任何内容都是参数,并且参数不被视为资源位置的一部分,因此它仍然有效。

https://jsonplaceholsdsdsdder.typicode.com/todos/dd不是有效的资源位置,因为jsonplaceholder.com没有公开具有该路径的资源。

这是因为API在服务器端的工作方式。

如果你尝试使用该路由,你会得到404错误,因为没有找到特定的路由。

如果使用searchParams.set方法,它只是后端将用于筛选todo的完整列表的一个参数,在这种情况下,调用成功,因此生成200响应代码。但响应结果为空,因此数组[]为空。

对于这个代码,id是在我们传递params时打印的但是如果你这样写异步函数getData({id}(它显示未定义为了解决这类问题,传递了不带{}大括号的id params

最新更新