使用HttpClient和自定义的Accept / Encoding标头发布

问题描述

我需要使用内部系统的第三方API,该API需要以下标头:

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

显然,分号和字符集之间的标头中的附加空格会产生响应,指出标头值无效。

如何处理这些标头值以包含那些空格?

解决方法

我通过继承MediaTypeHeaderValue来完善解决方法:

public class TrimmedMediaTypeHeaderValue : MediaTypeHeaderValue
{
   public TrimmedMediaTypeHeaderValue(string mediaType) :base(mediaType)
   {

   }

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

由于文档未指定将一起构建标头字符串的任何方法,因此我只是假设它将为ToString(),实际上的确是。因此,这现在将产生标头值,在;之间没有空格。和字符集。

请注意,该类只有一个构造函数,而不是基类的2个构造函数。因此,如果要使用此功能,则可能需要再添加一个。