web-dev-qa-db-fra.com

Récupère les métadonnées OData $ au format JSON

est-il possible d'obtenir les métadonnées d'un service OData au format JSON? 

Lorsque j'essaie d'utiliser format=json, cela ne fonctionne pas. Voici ce que j'ai essayé:

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

Le document $metadata est au format CSDL, qui n’a actuellement qu’une représentation XML. (Remarque: si vous souhaitez demander le format JSON pour un autre type de charge OData, assurez-vous que le jeton de requête format a devant lui un $: $format=json.)

Donc non, ce n'est pas possible. Vous pouvez cependant obtenir le document de service en JSON, qui est un sous-ensemble du document $ metadata:

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

Cela n'aura pas d'informations de type, mais il listera les points d'entrée disponibles du service (c'est-à-dire les ensembles d'entités).

17
Jen S

Au lieu de ?$format=json, vous pouvez également définir les deux en-têtes suivants:

  • Accept: application/json 
  • Content-Type: application/json; charset=utf-8 

Je ne sais pas quelle est la version minimale requise d'Odata, mais cela fonctionne parfaitement pour moi sur Microsoft Dynamics NAV 2016, qui utilise Odata v4.

1
John Slegers

J'ai écrit à un fournisseur simple pour analyser certaines des informations nécessaires à partir des métadonnées. N'hésitez pas à les développer. Vous aurez d’abord besoin de modèles simples, pour exprimer les données, nous voudrons convertir à partir de là des noms XML moches

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
}

C'est le fournisseur:

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;
            });
        });
    }
}
1
johnny 5

Vous pouvez utiliser jQuery pour obtenir les informations pertinentes à partir d'une métadonnée $ du service OData. 

Prends pour exemple:
Vous écrivez un test unitaire pour vérifier que les noms de propriété d'entités OData correspondent à vos entités d'application. Ensuite, vous devez récupérer les propriétés de l'entité 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);
            }
 });
1
Michael Sebastian

Je suis d'accord avec la réponse précédente. Ceci n'est pas supporté par la spécification, mais certains frameworks/bibliothèques OData sont sur le point d'implémenter cette fonctionnalité.

Je pense à Olingo. Cela pourrait vous être utile si vous implémentez également le côté serveur. Voir ce numéro dans la JIRA d’Olingo pour plus de détails:

J'espère que ça vous aidera, Thierry

1
Thierry Templier