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);
posted @ 2021-05-20 14:28  jzblive  阅读(2781)  评论(1编辑  收藏  举报