是否可以以JSON格式获取OData服务的元数据?
当我尝试使用format=json
时,它不起作用。这是我试过的:
http://odata.informea.org/services/odata.svc/$metadata/?format=json
答案 0 :(得分:18)
$metadata
文档采用CSDL格式,目前只有XML表示形式。 (作为旁注,如果您确实要为不同类型的OData有效负载请求json格式,请确保format
查询令牌前面有$
:$format=json
。)
所以,不可能。但是,您可以使用JSON获取服务文档,JSON是$ metadata文档的一个子集:
http://odata.informea.org/services/odata.svc?$format=json
这不会有类型信息,但会列出服务的可用入口点(即实体集)。
答案 1 :(得分:1)
我同意之前的回答。规范不支持此功能,但有些OData框架/库即将实现此功能。
我想起Olingo。如果您还实现了服务器端,这可能对您有所帮助。有关详细信息,请参阅Olingo JIRA中的此问题:
希望它可以帮到你, 亨利
答案 2 :(得分:1)
作为?$format=json
的替代方案,您还可以设置以下两个标题:
Accept: application/json
Content-Type: application/json; charset=utf-8
我不确定哪个是所需的最小Odata版本,但这对我来说非常适合使用Odata v4的Microsoft Dynamics NAV 2016。
答案 3 :(得分:1)
您可以使用jQuery从OData服务$ metadata获取相关信息。
以例如:
您编写单元测试以检查OData实体属性名称是否与您的应用程序实体匹配。然后,您必须检索OData实体的属性。
$.ajax({
type: "GET",
url: "/destinations/odata-service/$metadata",
beforeSend: function() {
console.log("before send check");
},
dataType: "xml",
contentType: "application/atom+xml",
context: document.body,
success: function(xml) {
console.log("Success ResourceTypes");
var ODataTypeINeed = $(xml).find('EntityType').filter(function(){
return $(this).attr('Name') == 'ODataTypeINeed'
});
$(ODataTypeINeed).find('Property').each(function() {
console.log($(this).attr('Name')); //List of OData Entity properties
});
},
error: function(err) {
console.log(err);
}
});
答案 4 :(得分:1)
我写了一个简单的提供程序来从元数据中解析出一些所需的信息,随意扩展它。首先你需要一些简单的模型,来表达数据,我们想要从那里转换出丑陋的XML名称
export class ODataEntityType
{
name: string;
properties: ODataProperty[];
}
export class ODataProperty
{
name: string;
type: ODataTypes;
isNullable: boolean;
}
//Hack Until Ionic supports TS 2.4
export class ODataTypeMap
{
"Edm.Int32" = ODataTypes.Int;
"Edm.Int64" = ODataTypes.Long;
"Edm.Decimal" = ODataTypes.Decimal;
"Edm.Double" = ODataTypes.Double;
"Edm.Guid" = ODataTypes.Guid;
"Edm.String" = ODataTypes.String;
"Edm.Boolean" = ODataTypes.Bool;
"Edm.DateTime" = ODataTypes.DateTime;
"Edm.DateTimeOffset" = ODataTypes.DateTimeOffset;
}
export enum ODataTypes
{
Int,
Long,
Decimal,
Double,
Guid,
String,
Bool,
DateTime,
DateTimeOffset
}
这是提供者:
import { Injectable } from "@angular/core";
import { Http } from "@angular/http";
import * as X2JS from 'x2js';
import * as _ from 'underscore';
import { ODataEntityType, ODataProperty, ODataTypes, ODataTypeMap } from "../models/ODataEntityType";
@Injectable()
export class ODataMetadataToJsonProvider {
x2js = new X2JS();
public entityTypeMap: Dictionary = new Dictionary();
public entityTypes : ODataEntityType[];
constructor(public http: Http) {
}
parseODataMetadata(metadataUrl: string) {
this.http.get(metadataUrl).subscribe(data => {
let metadata: any = this.x2js.xml2js(data.text());
let rawEntityTypes = _.filter(metadata.Edmx.DataServices.Schema, x => x["EntityType"] != null);
if(rawEntityTypes.length == 0)
{
return;
}
this.entityTypes = _.map(rawEntityTypes[0]["EntityType"], t => {
let oDataEntityType = new ODataEntityType();
oDataEntityType.name = t["_Name"];
oDataEntityType.properties = _.map(t["Property"], p => {
let property = new ODataProperty();
property.name = p["_Name"];
let typeStr: string = p["_Type"];
property.type = ODataTypeMap[typeStr];
property.isNullable = !!p["_Nullable"];
return property;
});
return oDataEntityType;
});
});
}
}
答案 5 :(得分:0)
2021 年,可能……
OData 4.01 规范包括对 JSON 的支持:https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_MetadataDocumentRequest
Microsoft 的 OData 实现增加了以下版本的支持:
此外,JSON 元数据是 only supported at platform implementing .NETStardard 2.0.
[sic]。
如果您调用的服务支持它,您可以在查询字符串中进行...
$format=application/json
$format=json
...或使用 http 标头:
Accept=application/json
它不是...要求服务提供商升级吗?