web api的新玩法

Bluto發表於2017-09-27

 前言:

     目前大多數的.net core 專案的web api 都是用的json作為資料傳輸格式,或者說幾乎是所有的都是,可是有沒有想過換一種資料傳輸格式怎麼處理,比如XML,或者谷歌首推的Protobuf資料傳輸格式?對於這種請求,我們要怎麼處理呢?比如相同的url 只是想用不同資料格式, api/Values.json | api/Values.xml 這又怎麼處理?

 正文:

    首先既然預設得是json格式,我們首先拿json開刀。

    新建一個 Core 2.0的web api 專案。進入預設的ValueController 中

        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

正常情況下我們預設請求的url是 api/values 然後取到上述資料 預設的json格式。

我們現在變一下 請求api/values.json 怎麼樣系統會識別嗎?我們試一下,不好意思系統並沒有鳥我,什麼都沒有給我。

 

那怎麼樣讓系統能夠識別呢?其實和簡單。FormateFilterAttribute 就行了。我們改造一下。

        [HttpGet("api/Values.{format}"),FormatFilter]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

  我們再次請求 api/values.json 

 好了取到資料了,如果我們把字尾換成.xml 怎麼樣?是不是就可以用xml進行資料傳輸了?

我們試一試。

天真是要付出代價的,原因是什麼呢?因為預設的json格式的資料。所以加上FormatFilterAttribute只是進行了一個過濾的作用,並沒有起到註冊型別的作用。

想解決這個問題需要引入新的nuget包

 <PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="2.0.0" />

然後在startup.cs 的configureServices中註冊xml 型別。

        public void ConfigureServices(IServiceCollection services)
        { 
            services.AddMvc(options=> {
                options.FormatterMappings.SetMediaTypeMappingForFormat("xml", "application/xml");
               
            });
        }

 然後我們訪問api/values.xml 

 

 

 

 

 

終於得到我們想要的資料了。

相關文章