Post 使用 HttpClient 和自定义接受/编码 headers

Post with HttpClient and custom Accept / Encoding headers

我需要使用内部系统的第 3 方 api,它需要以下 headers:

Accept application/json;charset=iso-8859-1
Content-Type application/json;charset=iso-8859-1

为了做到这一点,我拼凑了以下代码:

public async Task<bool> CreateOrDeleteFolder(CreateFolderRequestBody body)
{
   var request = new HttpRequestMessage(HttpMethod.Post, $"{BaseAddress}/testFolder.php");
   request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")
   {
      CharSet = "iso-8859-1"
   });
   
   var isoEncoding = Encoding.GetEncoding("iso-8859-1");
   var payload = new StringContent(JsonConvert.SerializeObject(body), isoEncoding, "application/json");

   request.Content = payload;
   HttpResponseMessage responseMessage = null;
   
   responseMessage = await _client.SendAsync(request);
  
   responseMessage.EnsureSuccessStatusCode();
   var responseBody = await responseMessage.Content.ReadAsStringAsync();
   //do something with the body
   return true;
}

这会产生以下请求:

POST http://somewhere.to/testFolder.php HTTP/1.1
Accept: application/json; charset=iso-8859-1
Content-Type: application/json; charset=iso-8859-1
Host: somwhere.to
Content-Length: 57
Expect: 100-continue
Connection: Keep-Alive

显然,分号和字符集之间 header 中的额外空格会产生一个响应,指出无效的 header 值。

我如何操纵这些 header 值,使 包含那些空格?

我通过继承 MediaTypeHeaderValue:

搞砸了一个解决方法
public class TrimmedMediaTypeHeaderValue : MediaTypeHeaderValue
{
   public TrimmedMediaTypeHeaderValue(string mediaType) :base(mediaType)
   {

   }

   public override string ToString() 
        => string.IsNullOrEmpty(CharSet)
           ? MediaType
           : $"{MediaType};charset={CharSet}";
}

由于文档没有指定任何可以一起构建 header 字符串的方法,我只是假设它会是 ToString() 并且确实如此 - 它是。所以这现在产生一个 header 值,在 ; 之间没有空格。和字符集。

请注意,此 class 只有一个构造函数,而不是基础 class 的两个构造函数。所以如果你想使用这个,你可能需要添加另一个。