iT邦幫忙

3

[C#][ASP.NET] Web API 開發心得 (3) - 統一回應 JSON 格式的資料

ASP.NET Web API 有兩種輸出格式 XML 和 JSON,會根據發送的 Accept 標頭決定回應的格式,而在沒有指定或查無格式的情況下,會預設回應 JSON 格式的內容。

測試程式:

namespace Api
{
    [RoutePrefix("api/test")]
    public class TestController : ApiController
    {
        //測試API
        [HttpGet]
        [Route("live")]
        public List<Student> Live()
        {
            return new List<Student>
            {
                new Student
                {
                    Id = 100,
                    Name = "小明"
                },
                new Student
                {
                    Id = 101,
                    Name = "小華"
                },
            };
        }
    }

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

下列為 Postman 測試結果。

Accept: application/xml

https://d1dwq032kyr03c.cloudfront.net/upload/images/20180325/20106865i1kdxIUlFy.jpg

Accept: application/json

https://d1dwq032kyr03c.cloudfront.net/upload/images/20180325/20106865KXs8F7gxNh.jpg

接著試著在 Chrome 瀏覽器上直接輸入 API 網址。

https://d1dwq032kyr03c.cloudfront.net/upload/images/20180325/20106865tjC1bIJtJL.jpg

可以看到因為 Chrome 瀏覽器預設會發送 XML 的 Accept,所以 Web API 回傳 XML 的資料,不過這樣在開發時不是很方便,可以直接在瀏覽器上看到 JSON 格式的資料嗎?

第一篇 的 Startup 內加入下方程式碼,將 XML 的 Formatter 移除,這樣 Web API 就會統一回應 JSON 格式的資料。

//移除 XML Formatter
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

結果:

https://d1dwq032kyr03c.cloudfront.net/upload/images/20180325/201068655n46MydZxP.jpg

如果希望回傳的 JSON 縮排換行,方便閱讀,可以加入以下程式碼。

//JSON 縮排
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

結果:

https://d1dwq032kyr03c.cloudfront.net/upload/images/20180325/20106865u58f3XCwxl.jpg

完整程式碼:

[assembly: OwinStartup(typeof(Core.Startup))]

namespace Core
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //移除 XML Formatter
            var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
            config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

            //JSON 縮排
            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            
            app.UseWebApi(config);
        }
    }
}

結語:

今天介紹了如何控制 Web API 輸出 XML 和 JSON 格式的資料,而移除 XML 和格式化是為了方便測試,正式上線後記得移除,確保 API 完整支持 XML 和 JSON,且輸出的資料最小化,這篇就到這裡,感謝大家觀看。

參考文章:

如何讓 ASP.NET Web API 無論任何要求都回應 JSON 格式
ASP.NET Web API 入門常用技巧


1 則留言

0
神Q超人
iT邦新手 2 級 ‧ 2018-03-26 10:36:00

和ashx一模一樣耶!!也許我可以找個小專案來試一下這個功能/images/emoticon/emoticon13.gif

fysh711426 iT邦研究生 4 級‧ 2018-03-26 15:10:53 檢舉

他們的功能很像,可以試試看。 /images/emoticon/emoticon01.gif

我要留言

立即登入留言