问题描述
我需要使用内部系统的第三方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个构造函数。因此,如果要使用此功能,则可能需要再添加一个。