客户要求ASP.NET Core API返回特定格式,怎么办?(续2)
前言
前2次,我們都是假設客戶需要返回不同的字符串格式。
但是,有可能客戶要求的返回是非本文格式,比如文件流。
怎么辦?
思路
前提,當然還是使用同一API接口,不影響現有使用方式。
雖然ASP.NET Core Web API默認使用SystemTextJsonOutputFormatter格式化響應,但是OutputFormatters集合里其實包含了StreamOutputFormatter。
那么實現目標就轉化為,怎么讓Web API使用StreamOutputFormatter?
DefaultOutputFormatterSelector
通過查看dotnet/aspnetcore源代碼,我們找到了DefaultOutputFormatterSelector,它是選擇IOutputFormatter以寫入對當前請求的響應的默認實現:
其中,選擇IOutputFormatter具體實現是通過判斷CanWriteResult方法,代碼如下:
foreach?(var?formatter?in?formatters) {formatterContext.ContentType?=?new?StringSegment();formatterContext.ContentTypeIsServerDefined?=?false;if?(formatter.CanWriteResult(formatterContext)){return?formatter;} }而StreamOutputFormatter是這樣實現CanWriteResult方法的:
public?bool?CanWriteResult(OutputFormatterCanWriteContext?context) {if?(context?==?null){throw?new?ArgumentNullException(nameof(context));}//?Ignore?the?passed?in?content?type,?if?the?object?is?a?Stream.if?(context.Object?is?Stream){return?true;}return?false; }那么實現目標就轉化為,怎么讓Web API返回的是Stream?
操作返回類型
微軟官方文檔ASP.NET Core Web API 中控制器操作的返回類型[1]提到,返回類型除了支持特定類型之外,還支持ActionResult<T>。
ActionResult<T>可以返回從ActionResult派生的類型或返回特定類型:
那么實現目標就轉化為,將返回類型設為ActionResult<T>,根據條件返回T,或者返回特定ActionResult派生類,例如FileResult。
實現
具體實現代碼如下,如果Accept Header是text/json則返回文件流:
[HttpGet] public?ActionResult<IEnumerable<WeatherForecast>>?Get() {var?rng?=?new?Random();var?result?=?Enumerable.Range(1,?5).Select(index?=>?new?WeatherForecast{Date?=?DateTime.Now.AddDays(index),TemperatureC?=?rng.Next(-20,?55),Summary?=?Summaries[rng.Next(Summaries.Length)]}).ToArray();HttpContext.Request.Headers.TryGetValue("Accept",?out?var?acceptValue);if?(acceptValue.ToString()?==?"text/json"){using?(var?memory?=?new?MemoryStream()){using?(var?writer?=?new?StreamWriter(memory)){writer.Write(System.Text.Json.JsonSerializer.Serialize(result));writer.Flush();}return?File(memory.ToArray(),?"text/json",?"WeatherForecast.json");}?}return?result; }結論
現在,只需要客戶在每個API請求加上Accept Header即可滿足需求。
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“
參考資料
[1]
ASP.NET Core Web API 中控制器操作的返回類型: https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?view=aspnetcore-5.0
總結
以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?(续2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF XAML 为项目设置全局样式
- 下一篇: asp.net ajax控件工具集 Au