以JSON格式获取OData $元数据

时间:2013-09-08 11:49:47

标签: json odata

是否可以以JSON格式获取OData服务的元数据?

当我尝试使用format=json时,它不起作用。这是我试过的:

http://odata.informea.org/services/odata.svc/$metadata/?format=json

6 个答案:

答案 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 实现增加了以下版本的支持:

  • ODataLib 7.7.3(2020 年 9 月 24 日发布)
  • WebAPI 7.5.4(2020 年 12 月 29 日发布)

此外,JSON 元数据是 only supported at platform implementing .NETStardard 2.0. [sic]。

如果您调用的服务支持它,您可以在查询字符串中进行...

  • $format=application/json
  • $format=json

...或使用 http 标头:

  • Accept=application/json

它不是...要求服务提供商升级吗?