[Web API]取得傳入API的Body內容

[Web API]取得傳入API的Body內容

當我們呼叫Web Api時,通常會用JSON字串來傳遞資料,Web Api再建立物件接收JSON,假設寫好的Web API如下,當傳入的JSON字串無法正確轉成GetClass物件時,就會取得一個null物件。

//接收JSON字串並自動轉成GetClass物件
public string GET(GetClass pInput)
{
	//資料處理...
    return "";
}

此時就需要將傳入的原始字串記錄下來,以便確認傳入的內容為何,作法如下:

建立新Handler繼承DelegatingHandler,覆寫SendAsync攔截傳入的HttpRequestMessage內容,將內容以非同步的方式,取得Body中的文字後記錄到文字檔備查。

//記錄呼叫API傳過來的body中字串(JSON data)
public class LogRequestAndResponseHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // log request body
        if (request.Content != null)
        {
            request.Content.ReadAsByteArrayAsync().ContinueWith(
                (task) =>
                    {
                        var bodyStr = System.Text.UTF8Encoding.UTF8.GetString(task.Result);
                        //將取得的內容記錄到文字檔中;
                    });
        }
        return base.SendAsync(request, cancellationToken); //call the base
    }
}

於WebApiConfig.cs中註冊新建好的Handler即可。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MessageHandlers.Add(new LogRequestAndResponseHandler());
    }
}