我们正在使用OData v4.0,我们试图得到一个嵌套调用,我们有一个$过滤器和一个$选择,然后一个$扩展。$expand还有一个$select。如果$select和$expand没有被添加到同一个查询中,则它们可以工作。
例如;$select本身如下:
/adsTradeLineEventReserves?$filter=destTradeDocumentNo eq 'S*1249'&$select=carrierNo,destTradeDocumentNo
在搜索结果
{
"@odata.context": "https://*************/TEST/api/ADS/ADS/v1.0/$metadata#adsTradeLineEventReserves",
"value": [
{
"@odata.etag": "W/"JzE4OzU4NzkyNTAwODEyMzAyNDA1NzE7MDA7Jw=="",
"carrierNo": "",
"destTradeDocumentNo": "S00001249"
}
]
}
$会像这样自己展开。
/adsTradeLineEventReserves?$filter=destTradeDocumentNo eq 'S*1249'&$expand=adsReserveItemInventories
在搜索结果
{
"@odata.context": "https://*************/TEST/api/ADS/ADS/v1.0/$metadata#adsTradeLineEventReserves",
"value": [
{
"@odata.etag": "W/"JzE4OzU4NzkyNTAwODEyMzAyNDA1NzE7MDA7Jw=="",
"systemId": "df3fda84-b069-ed11-8a35-0022487ef089",
"binCode": "C06",
"ceLabelCode": "NOCU",
"ceUnitOfMeasure": "KG",
"carrierNo": "",
"createdDateTime": "0001-01-01T00:00:00Z",
"createdUserID": "",
"destTradeDocDetLineNo": 0,
"destTradeDocumentLineNo": 10000,
"destTradeDocumentNo": "S00001249",
"destTradeDocumentType": "Document",
"adsReserveItemInventories": [
{
"@odata.etag": "W/"JzE5Ozc0MjUwNTk4NzIyNTI3MjQ0ODUxOzAwOyc="",
"id": "4274ce1e-4d50-ed11-8a2e-0022487ef089",
"EntryNo": 6904,
"ItemNo": "CAPYEL",
"VariantCode": "",
"LotNo": "10000746",
"CarrierNo": "C00002085"
},
{
"@odata.etag": "W/"JzE5Ozk0OTcyMjQxNjc5MjEzODkxMzkxOzAwOyc="",
"id": "5474ce1e-4d50-ed11-8a2e-0022487ef089",
"EntryNo": 6905,
"ItemNo": "CAPYEL",
"VariantCode": "",
"LotNo": "10000746",
"CarrierNo": "C00002086"
}
]
}
]
}
但是当我把$select和$expand组合在一起时,它看起来是这样的
/adsTradeLineEventReserves?$filter=destTradeDocumentNo eq 'S*1249'&$select=carrierNo,destTradeDocumentNo&$expand=adsReserveItemInventories
这会导致无效的JSON结构,如您所见。
{"@odata.context":"https://*************/TEST/api/ADS/ADS/v1.0/$metadata#adsTradeLineEventReserves","value":[{"@odata.etag":"W/"JzE4OzU4NzkyNTAwODEyMzAyNDA1NzE7MDA7Jw=="","carrierNo":"","destTradeDocumentNo":"S00001249"
$expand将被完全忽略,无效的JSON将在$select之后返回。我试过改变顺序,把$expand放在前面,$select放在最后。但它会产生相同的无效JSON。我还尝试删除过滤器并添加服务器端分页,但这两者都导致相同的无效JSON。
我完全不知道出了什么问题。我期望OData返回一个错误,而不是一个未完成的JSON。同时支持$select和$expand在同一个请求中,并且是通用的。您的语法对于OData v4兼容的服务是正确的,因此您应该咨询供应商(OutSystems.com)以获得技术支持。
我唯一一次看到这种情况是当有一个数据相关的问题,这意味着序列化程序停滞或遇到异常,因为输出不完整,我怀疑这里的情况类似。
由于这实际上是一个实现问题,我们只能推测,然而有时简单地颠倒查询选项的顺序或确保所有必需的属性都包含在$select
中将有助于避免常见的实现问题。
祝你好运,请反馈你的解决方案,它不会帮助一般的OData社区,但将对其他Out Systems用户有用。