.NET Core 3.1 HttpClient调用POST接口返回Bad Request但Postman正常
问题
我有一个客户提供的POST类型API端点,使用Postman可以正常调用并获取响应。
Postman的可用设置如下:
URL: https://somedomain.com/rest/portal/authenticate Headers: "Content-Type":"application/x-www-form-urlencoded" "Referrer": "10.xx.xx.xx" // 此处为真实IP地址 Body: (x-www-form-urlencoded) "username": "TestAdmin" "password": "testpassword"
该设置可正常运行,我能在Postman中收到响应。
现在在同一台笔记本上,我尝试用.NET Core 3.1的方法发起POST请求,代码如下:
string userName = _config.GetSection("username").Value; string Password = _config.GetSection("password").Value; string BaseURL = _config.GetSection("baseURL").Value; // https://somedomain.com/rest var dict = new Dictionary<string, string>(); dict.Add("username", userName); dict.Add("password", Password); var client = new HttpClient(); var req = new HttpRequestMessage(HttpMethod.Post, BaseURL + $"/portal/authenticate") { Content = new FormUrlEncodedContent(dict) }; req.Headers.Add("Referer", "10.xx.xx.xx"); // 此处填入真实IP地址 var response = client.SendAsync(req).Result; string responseContent = response.Content.ReadAsStringAsync().Result;
但这种方式会返回Bad Request错误,附带“无效用户(Invalid user)”提示。
请问我哪里操作有误?我构建的请求是否与Postman中的请求不一致?
解决方案
- 校验配置项读取结果:确认
_config.GetSection("username")和_config.GetSection("password")确实读取到了TestAdmin和testpassword,排查配置文件键名拼写错误、值为空或不匹配的情况,这是导致“无效用户”提示的常见原因。 - 修正Header名称:Postman中使用的Header是
Referrer,但代码里写的是Referer(少一个字母r),部分服务器会严格校验Header名称,将代码中的req.Headers.Add("Referer", "...")改为req.Headers.Add("Referrer", "...")后重试。 - 规范URL拼接方式:避免手动拼接URL时出现重复斜杠的问题,比如
BaseURL末尾带/的话,拼接后会变成rest//portal/authenticate,改用new Uri(new Uri(BaseURL), "/portal/authenticate")生成请求URL,确保地址格式正确。 - 对比请求报文差异:用Fiddler抓包对比Postman和代码发起的请求,或者使用Postman的“生成代码”功能导出.NET Core格式的请求代码,和自己的代码做逐行对比,排查Header、Body、URL等细节的不一致。
内容的提问来源于stack exchange,提问作者Bluemarble
相关产品推荐
相关产品推荐

