[Web API] HttpClient Response 中文亂碼問題排除
前言
日前在進行異質系統資料介接工作時,發現透過 HttpClient 呼叫客戶端 Web API 後回應的中文資訊皆為亂碼;經過明查暗訪後發現 Response HttpHeader 中沒有 CharSet 資訊,因此 HttpClient 會以預設編碼方式來對文字解碼,所以就造成中文解碼錯誤產生亂碼情況。
解決方案
最快的解決方案當然就是請 Web API 提供端明確載明回應內容的編碼方式,這樣就不需要耗費雙方的時間來處理這項問題;但是當對手頑強時,自己就必須尋找出路,因此我們可以自行定義一個客製化的 HttpClientHandler ,當 Response HttpHeader 中沒有註明 CharSet 資訊時,自行指定 CharSet 資訊來作為後續文字解析之依據。以下以BIG5編碼格式作為Response預設CharSet為例,參考如下。
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var rsponse = await base.SendAsync(request, cancellationToken);
var contentType = rsponse.Content.Headers.ContentType;
// Set response charset if not exist
if (string.IsNullOrEmpty(contentType.CharSet))
{ contentType.CharSet = "BIG5"; }
return rsponse;
}
}
接著只需要在建立 HttpClient 實體時,於建構子中注入剛剛自行定義 Big5HttpClientHandler 物件,如此就可以排除中文亂碼的問題了,示意代碼如下。
{
// Create an HttpClient instance
// Inject Big5HttpClienHanlder to handle empty response charset
HttpClient client = new HttpClient(new Big5HttpClienHanlder());
// Prepare request content
var jsonstr = JsonConvert.SerializeObject(request);
var content = new StringContent(jsonstr, Encoding.UTF8, "application/json");
// Send a request
HttpResponseMessage response = await client.PostAsync(@"http://xx/api/boo", content);
// Check that response was successful or throw exception
response.EnsureSuccessStatusCode();
// Read response as ResposeDTO
return await response.Content.ReadAsAsync<ResposeDTO>();
}
參考資訊
http://www.cnblogs.com/TianFang/archive/2012/03/10/2389480.html
http://blogs.msdn.com/b/henrikn/archive/2012/02/16/httpclient-is-here.aspx
希望此篇文章可以幫助到需要的人
若內容有誤或有其他建議請不吝留言給筆者喔 !