本文屬于 OData 系列文章
引言
OData 是一個(gè)開放標(biāo)準(zhǔn),已經(jīng)在 oasis 組織標(biāo)準(zhǔn)化,因此我們可以在標(biāo)準(zhǔn)的官網(wǎng)查詢到 OData 的標(biāo)準(zhǔn)請(qǐng)求與返回形式:OData JSON Format Version 4.01 (oasis-open.org)
針對(duì)不同的數(shù)據(jù)類型,輸出返回的格式也不盡相同,涉及的內(nèi)容非常多。日常使用 OData 的過程中,我們經(jīng)常處理的是實(shí)體對(duì)象以及實(shí)體對(duì)象的集合。如果直接返回 IQueryable
用于 OData 查詢,那么返回的數(shù)據(jù)大多是集合(數(shù)組/列表)。
{
????"@odata.context":?"http://localhost:9000/api/v2/$metadata#Collection(Datum_AggDto)",
????"@odata.count":?2,
????"value":?[
????????{
????????????"timestamp":?1682294400000,
????????????"max":?180.0,
????????????"min":?152.0,
????????????"avg":?161.7605633802817
????????},
????????{
????????????"timestamp":?1682985600000,
????????????"max":?281.0,
????????????"min":?180.0,
????????????"avg":?228.39583333333334
????????}]
}
這個(gè)數(shù)組對(duì)象也不是很純粹,它被 value 封裝,并且提供了 @odata.context
元數(shù)據(jù)鏈接。如果我們的 API 沒有被 OData 路由解析,那么默認(rèn) WEBAPI 會(huì)返回一個(gè)純粹的數(shù)組對(duì)象:
[
{
"timestamp":?1682294400000,
"max":?180.0,
"min":?152.0,
"avg":?161.7605633802817
},
{
"timestamp":?1682985600000,
"max":?281.0,
"min":?180.0,
"avg":?228.39583333333334
}]
假設(shè)我們的對(duì)外的數(shù)據(jù)接口不完全被 OData 路由,會(huì)導(dǎo)致前端訪問的行為不一致:一些 API 可以直接解析,另外一些 API 則需要使用 value 封裝后處理。
封裝非 OData Route Mapping
由于 OData 有了標(biāo)準(zhǔn),為了對(duì)外保持一致性,我們可以嘗試在返回非 OData 路由 API 時(shí),將原始數(shù)組對(duì)象進(jìn)行封裝。
單實(shí)體對(duì)象
[HttpGet("/api/v1/Current")]
[ProducesResponseType(typeof(DeviceDataDto), Status200OK)]
public IActionResult Current(string key)
{
key = key.Trim('\'');
var data = _context.DeviceData.Where(w => w.DeviceId == key).OrderByDescending(w => w.Timestamp).FirstOrDefault();
return Ok(_mapper.Map<DeviceDataDto>(datas));
}
對(duì)于以上的代碼,只返回單個(gè)實(shí)體對(duì)象,返回的形式與 OData 標(biāo)準(zhǔn)中返回單個(gè)實(shí)體對(duì)象的標(biāo)準(zhǔn)一致,因此不需要額外的轉(zhuǎn)換操作。
{
//OData 返回會(huì)多一個(gè)context,普通API不會(huì)有。
"@odata.context":?"http://localhost:9000/api/v2/$metadata#Datum_AggDto",
"timestamp":?1682985600000,
"max":?281.0,
"min":?180.0,
"avg":?228.39583333333334
}
實(shí)體對(duì)象集合
[HttpGet("/api/v1")]
[ProducesResponseType(typeof(IEnumerable<DeviceDataDto>), Status200OK)]
public async Task<IActionResult> Get(string key)
{
key = key.Trim('\'');
return Ok(await _context.DeviceData.Where(w => w.DeviceId == key).ToListAsync());
}
以上代碼返回的類型是一個(gè)集合,并且被 OData 路由映射。我們使用 value 這個(gè) key 對(duì)齊進(jìn)行封裝:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-445308.html
[HttpGet("/api/v1")]
[ProducesResponseType(typeof(IEnumerable<DeviceDataDto>), Status200OK)]
public async Task<IActionResult> Get(string key)
{
key = key.Trim('\'');
var datas = await _context.DeviceData.Where(w => w.DeviceId == key).ToListAsync();
var result = new { Value = datas };
return Ok(result);
}
注意這個(gè) Value
我使用的是大寫,由于我啟用了 camelCase
,所以會(huì)自動(dòng)轉(zhuǎn)換為小寫。這樣前端訪問 API 時(shí),不論是否為 OData API 都可以訪問 value 的值獲取數(shù)組對(duì)象。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-445308.html
到了這里,關(guān)于OData WebAPI實(shí)踐-兼容OData集合響應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!