[Web API] HttpClient Response 中文亂碼問題排除

[Web API] HttpClient Response 中文亂碼問題排除

前言

 

日前在進行異質系統資料介接工作時,發現透過 HttpClient 呼叫客戶端 Web API 後回應的中文資訊皆為亂碼;經過明查暗訪後發現 Response HttpHeader 中沒有 CharSet 資訊,因此 HttpClient 會以預設編碼方式來對文字解碼,所以就造成中文解碼錯誤產生亂碼情況。

 

image

 

 

解決方案

 

最快的解決方案當然就是請 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


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !