使用PostAsJsonAsync请求返回403错误,但Postman请求正常
解决HttpClient调用HowLongToBeat API返回403的问题
1. 添加User-Agent请求头
网站反爬机制通常会拦截HttpClient默认的User-Agent(一般是System.Net.Http.HttpClient或.NET开头标识),而Postman会自动携带浏览器/Postman专属的User-Agent。需要手动添加符合浏览器规范的User-Agent:
修改Startup.cs中的HttpClient配置:
services.AddHttpClient(HttpClients.HowLongToBeat.ToString(), config => { config.BaseAddress = new Uri("https://www.howlongtobeat.com/"); config.DefaultRequestHeaders.Add("Referer", "https://www.howlongtobeat.com/"); // 模拟Chrome浏览器的User-Agent config.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); });
2. 明确设置Accept请求头
确保请求明确声明接受JSON格式响应,Postman通常会自动包含该头,但HttpClient默认的Accept规则可能不够明确:
在上述配置中添加:
config.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
3. 验证请求体序列化一致性
虽然你已使用JsonNamingPolicy.CamelCase,但需确认序列化结果和Postman请求体完全匹配:
- 检查
SearchTerms数组:若searchTerm是单个词(如"mario"),Split(" ")生成的["mario"]和Postman一致;若为多词,需确保分割逻辑正确。 - 验证嵌套对象属性名:比如
UserId是否序列化为userId、SortCategory是否为sortCategory等。可通过临时序列化并输出字符串对比:
var json = JsonSerializer.Serialize(request, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); Console.WriteLine(json); // 和Postman的请求体文本逐一比对
4. 禁用自动重定向(可选)
部分场景下网站的重定向逻辑会触发403,尝试关闭HttpClient自动重定向:
services.AddHttpClient(HttpClients.HowLongToBeat.ToString(), config => { // 其他配置... }) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { AllowAutoRedirect = false });
5. 同步Cookie(可选)
如果Postman请求携带了会话Cookie,需在HttpClient中同步Cookie:
var cookieContainer = new CookieContainer(); // 可从Postman的请求头中复制Cookie值,手动添加到容器 cookieContainer.Add(new Uri("https://www.howlongtobeat.com/"), new Cookie("cookieName", "cookieValue")); services.AddHttpClient(HttpClients.HowLongToBeat.ToString(), config => { // 其他配置... }) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { CookieContainer = cookieContainer, UseCookies = true });
内容的提问来源于stack exchange,提问作者muttley91
相关产品推荐
相关产品推荐

