C# HttpClient发送POST请求返回400,Postman请求正常的原因排查
差异原因及解决方案
手动拼接JSON引发语法错误
当前通过字符串拼接构造payload,极易出现JSON语法问题,例如"sessionId":" + "\"1\"" + ","会生成"sessionId":""1""(双引号嵌套),这属于无效JSON。Postman的JSON构造不会出现这类问题,建议改用对象序列化生成JSON,确保语法绝对正确:// 用匿名类定义请求体结构 var payloadObj = new { merchantId = merchantId, posId = merchantId, sessionId = "1", amount = 2137, currency = "PLN", description = "test_from_c#", email = "sample@gmail.com", country = "PL", language = "pl", urlReturn = urlReturn, timeLimit = 15, waitForResult = true, shipping = 0, sign = stringHashResult }; // 序列化生成JSON string payload = System.Text.Json.JsonSerializer.Serialize(payloadObj);签名计算数据源不一致
代码中计算SHA384签名的jsonData是硬编码的固定字符串,若实际merchantId变量值与jsonData中的00000不符,会导致签名不匹配。需确保签名计算的数据源与Postman完全一致,比如使用和请求体相同的字段组合生成签名原始数据。UrlEncode处理差异
代码中对urlReturn执行了UrlEncode,但Postman可能未做编码或编码规则不同。例如http://sample.com/编码后为http%3a%2f%2fsample.com%2f,若接口期望原始URL而非编码值,会引发参数错误。需对比Postman中的urlReturn值,确认是否需要编码。HttpClient行为与Postman不一致
- 代码同时创建了
_httpClientFactory.CreateClient()和new HttpClient(),后者未复用工厂配置,可能存在默认头差异; - 可显式指定
StringContent的字符集,确保与Postman的Content-Type一致:var content = new StringContent(payload, Encoding.UTF8, "application/json"); content.Headers.ContentType.CharSet = "utf-8"; - 部分接口会校验
User-Agent,HttpClient默认值与Postman不同,可手动设置匹配:client.DefaultRequestHeaders.UserAgent.ParseAdd("PostmanRuntime/7.29.0");
- 代码同时创建了
未读取完整错误信息
当前异常仅捕获状态码描述,但响应体包含40字节的详细错误内容,需读取该内容定位具体问题:catch (HttpRequestException ex) when (response != null) { var errorDetail = await response.Content.ReadAsStringAsync(); return BadRequest($"请求失败: {ex.Message},详细错误: {errorDetail}"); }
内容的提问来源于stack exchange,提问作者Lacwik
相关产品推荐
相关产品推荐

