FormUrlEncodedContent 踩坑记
起因
使用 FormUrlEnCodeContent
提交数据时,提示签名错误。经过多次协调签名没有错误,标准的base64字符串。
var fd = new Dictionary<string, string>();
// 添加业务数据部分省略
var parth = "/api/api/mall/order/info/V1"
var client = _httpClientFactory.CreateClient("Dev_Biz1");
var res = await client.PostAsync(path, new FormUrlEnCodeContent(fd));
var code = (int)res.StatusCode;
var content = await res.Content.ReadAsStringAsync();
原因
FormUrlEnCodeContent
的编码格式不是 utf-8
, 而是Encoding.Latin1
。
具体代码看着里:FormUrlEnCodeContent
和这里HttpRuleParser
解决方式
使用StringContent
替代,并指定编码格式为 utf-8
。
var formStr = string.Join('&', fd.Select(kv=> $"{kv.Key}={HttpUtility.UrlEncode(kv.Value)}"));
var formCtx = new StringContent(formStr , Encoding.UTF8,"application/x-www-form-urlencoded");
var res = await client.PostAsync(path, formCtx);