前言:
目前大多數的.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
終於得到我們想要的資料了。