C# HttpClient 实现HTTP Client 请求
为什么? C# httpclient get 请求和直接浏览器请求结果不一样
为了测试一下HTTP接口的,用C# HttpClient实现了HTTP客户端,用于从服务端获取数据。
但是遇到了问题:C# httpclient get 请求和直接浏览器请求结果不一样
初始代码如下:
using var client = new HttpClient();
// 发送GET请求并获取响应
HttpResponseMessage response = await client.GetAsync(url);
// 检查响应是否成功
if (response.IsSuccessStatusCode)
{
// 读取响应内容
string responseBody = await response.Content.ReadAsStringAsync();
// 输出响应内容
Console.WriteLine($"Response: {responseBody}");
}
else
{
Console.WriteLine($"Failed to make a GET request. Status code: {response.StatusCode}");
}
但是,运行后返回的是不是url请求的数据,而是业务系统的登录页面
直接在浏览器中输入url ,返回的确是想要的真实数据。 这是为什么呢?
检查代码,发现请求时没有设置User-Agent,content-type,Cookie。于是查看浏览器请求时的相关信息。打开Request Headers页签, 找到Cookie, User-Agent
修改代码如下:
// 创建 HttpRequestMessage 对象,并设置请求方法为 GET
var request = new HttpRequestMessage(HttpMethod.Get, url);
// 设置 User-Agent
request.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36");
// 设置 Content-Type
// 注意:GET 请求通常不包含 Content-Type 头部,但如果服务器期望的话可以设置
request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
// 设置 Cookie
// 假设你有一个名为 ".ASPXAUTH" 的 cookie
request.Headers.TryAddWithoutValidation("Cookie", ".AspNetCore.Antiforgery.ut3hBcs7PyQ=CfDJ8B39P6wWsIRNiIVDbsTXLHYufBdcmrCZYgxXr1sfyx46YXztgSQolAhsH0dQvCNgnzrXKdyc9R3r5FggSgv7cQs13W7VcmHWe55Gl0sUbptQdtWihufANnqPD4s4YNBpYdqucGCWCFVhhS0dZ4jMS2c; .AspNetCore.Session=CfDJ8B39P6wWsIRNiIVDbsTXLHad7R7YNnCk600Mi34VEhxV4ZRKSQpiugQ4mXnEXlwD30zfWYy8T5xwMu%2BNT0qLNOSyCW16sl9421rxi%2BYxttfnTY%2BSvbarpm1JbpLQHSD%2BTC3fCZG%2BtUtFp9KqCzPo2oW7l8Lnu47PL5fu9N4WYhJF");
// 发送请求并获取响应
HttpResponseMessage hresponse = await client.SendAsync(request);
编译代码,重新运行时,请求结果和浏览器直接调接口一致。