基于Yew的Wasm Rust应用调用Notion API遇401认证错误
Yew(Wasm)中reqwest请求Notion API返回401的解决办法
你的问题核心出在fetch_mode_no_cors()上——浏览器在no-cors模式下会主动过滤掉Bearer Token这类非简单请求头,这就导致Notion API收不到你的认证信息,返回401。而Postman、curl是客户端工具,不受浏览器同源策略和no-cors的限制,所以请求能正常通过。
为什么移除fetch_mode_no_cors()后请求发不出?
因为你的Wasm应用运行在浏览器里,Notion API的域名和你的应用域名不同,触发了浏览器的同源策略,直接跨域请求会被拦截。
解决思路:用反向代理绕过跨域(推荐)
通过反向代理让你的应用请求自己的域名,再由代理转发到Notion API,这样就不存在跨域问题,无需no-cors模式,认证头也能完整传递。
1. 配置反向代理(以Yew常用的Trunk为例)
在项目根目录的trunk.toml中添加代理规则:
[[proxy]] from = "/api/notion" to = "https://api.notion.com/v1/databases/你的数据库ID/query"
替换to中的URL为你的实际Notion数据库查询接口地址。
2. 修改reqwest请求代码
去掉fetch_mode_no_cors(),请求代理后的本地路径:
let client = reqwest::Client::new(); let request = client .get("/api/notion") .bearer_auth(NOTION_TOKEN) .header("Notion-Version", NOTION_VERSION) .build() .unwrap(); let response = client.execute(request).await.unwrap();
其他验证点
- 确保代理配置正确,启动Trunk后,访问
http://localhost:8080/api/notion应能收到Notion的正常响应。 - 检查浏览器开发者工具的Network面板,确认请求头中包含
Authorization: Bearer xxx和Notion-Version。
内容的提问来源于stack exchange,提问作者TheVonKanar
相关产品推荐
相关产品推荐

