雖然 ASP.NET Web API 內建支援 JSON 與 XML 兩種輸出格式,並依據瀏覽器端送出的 Accept 標頭自動決定回應的內容格式,不過有時候我們的確也需要讓程式來控制要回應哪種格式,本文將介紹如何讓 ASP.NET Web API 自訂回應結果格式 (XML 或 JSON),以方便透過其他方法來決定如何回應訊息格式。
我們先來看看 ASP.NET MVC 4 專案範本幫我們產生預設 API 裡的 Get() 方法,程式碼非常簡單:
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
如果我們要自訂回應格式的話,那麼 API 的回傳型別必須改成 HttpResponseMessage 才行,並透過以下程式碼做到自訂切換回應格式的動作:
// GET api/values
public HttpResponseMessage Get(string output = null)
{
var data = new string[] { "value1", "value2" };
var resp = new HttpResponseMessage(HttpStatusCode.OK);
if (output == "xml")
{
resp.Content = new ObjectContent<IEnumerable<string>>(data, new XmlMediaTypeFormatter());
}
else
{
resp.Content = new ObjectContent<IEnumerable<string>>(data, new JsonMediaTypeFormatter());
}
return resp;
}
這段程式碼我大概解釋一下:
- 第 2 行:透過 ASP.NET MVC 的模型繫結機制取得 Query String 上的 output 參數
- 第 6 行:建立 HttpResponseMessage 物件,並指定 HTTP 回傳狀態為 200 (OK)
- 第 8 ~ 15 行:自訂回應內容的程式碼,我們要透過 ObjectContent 型別傳入一個泛型參數來建立內容物件,而這個泛型參數就是在修改之前 Get() 方法的回傳型別 IEnumerable<string>,傳入的第一個參數是要輸出的資料,第二個參數則是輸出格式,這時你就可以選擇輸出 XmlMediaTypeFormatter 還是 JsonMediaTypeFormatter 了。
如果要對該 API 進行測試,可以輸入以下網址路徑:
- /api/values?output=xml
- /api/values?output=json
相關連結