Rust用reqwest请求watchparty接口返回JS依赖页面,如何匹配curl效果?
解决reqwest请求返回"You need to enable JavaScript to run this app."的问题
问题核心是你的reqwest请求和curl请求的请求头差异,目标网站通过请求头(尤其是User-Agent)识别请求来源,返回了不同内容。以下是不需要curl crate的解决办法:
1. 对比curl与reqwest的请求头差异
执行带详细日志的curl命令,查看它默认发送的请求头:
curl -v -X POST -H "Content-Type: application/json" -d '{"video":""}' watchparty.me/createRoom -L
你会看到curl默认发送的关键头信息,比如:
User-Agent: curl/7.81.0(版本号可能随你的curl版本变化)Accept: */*
而reqwest默认的请求头(比如User-Agent: reqwest/0.11.x)会被网站判定为非合法请求,从而返回需要JS加载的页面。
2. 编写匹配curl请求头的reqwest代码
首先确保Cargo.toml中reqwest启用了必要特性:
[dependencies] reqwest = { version = "0.11", features = ["json", "native-tls", "redirect"] } tokio = { version = "1.0", features = ["full"] } serde_json = "1.0"
然后编写请求代码,完全对齐curl的请求头:
use reqwest::Client; use serde_json::json; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // 构建支持重定向的客户端(对应curl的-L参数) let client = Client::builder() .redirect(reqwest::redirect::Policy::follow()) .build()?; let response = client.post("https://watchparty.me/createRoom") // 保持Content-Type与curl一致 .header("Content-Type", "application/json") // 复制curl的User-Agent,让网站识别为curl请求 .header("User-Agent", "curl/7.81.0") // 设置Accept头为curl默认的*/* .header("Accept", "*/*") // 传入JSON请求体 .body(json!({"video": ""}).to_string()) .send() .await?; let body = response.text().await?; println!("{}", body); Ok(()) }
3. 验证与调整
如果还是不行,把curl输出的所有请求头都复制到reqwest中(比如Host、Connection等),确保请求的每一个细节都和curl一致。
内容的提问来源于stack exchange,提问作者lolozen
相关产品推荐
相关产品推荐

