我在尝试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