客户要求ASP.NET Core API返回特定格式,怎么办?(续2)
前言
前2次,我們都是假設(shè)客戶需要返回不同的字符串格式。
但是,有可能客戶要求的返回是非本文格式,比如文件流。
怎么辦?
思路
前提,當(dāng)然還是使用同一API接口,不影響現(xiàn)有使用方式。
雖然ASP.NET Core Web API默認(rèn)使用SystemTextJsonOutputFormatter格式化響應(yīng),但是OutputFormatters集合里其實包含了StreamOutputFormatter。
那么實現(xiàn)目標(biāo)就轉(zhuǎn)化為,怎么讓W(xué)eb API使用StreamOutputFormatter?
DefaultOutputFormatterSelector
通過查看dotnet/aspnetcore源代碼,我們找到了DefaultOutputFormatterSelector,它是選擇IOutputFormatter以寫入對當(dāng)前請求的響應(yīng)的默認(rèn)實現(xiàn):
其中,選擇IOutputFormatter具體實現(xiàn)是通過判斷CanWriteResult方法,代碼如下:
foreach?(var?formatter?in?formatters) {formatterContext.ContentType?=?new?StringSegment();formatterContext.ContentTypeIsServerDefined?=?false;if?(formatter.CanWriteResult(formatterContext)){return?formatter;} }而StreamOutputFormatter是這樣實現(xiàn)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; }那么實現(xiàn)目標(biāo)就轉(zhuǎn)化為,怎么讓W(xué)eb API返回的是Stream?
操作返回類型
微軟官方文檔ASP.NET Core Web API 中控制器操作的返回類型[1]提到,返回類型除了支持特定類型之外,還支持ActionResult<T>。
ActionResult<T>可以返回從ActionResult派生的類型或返回特定類型:
那么實現(xiàn)目標(biāo)就轉(zhuǎn)化為,將返回類型設(shè)為ActionResult<T>,根據(jù)條件返回T,或者返回特定ActionResult派生類,例如FileResult。
實現(xiàn)
具體實現(xiàn)代碼如下,如果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; }結(jié)論
現(xiàn)在,只需要客戶在每個API請求加上Accept Header即可滿足需求。
如果你覺得這篇文章對你有所啟發(fā),請關(guān)注我的個人公眾號”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
總結(jié)
以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?(续2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF XAML 为项目设置全局样式
- 下一篇: 记一次 .NET 某消防物联网 后台服务