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 的两个构造函数。所以如果你想使用这个,你可能需要添加另一个。
我需要使用内部系统的第 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 的两个构造函数。所以如果你想使用这个,你可能需要添加另一个。