jSON形式でODataサービスのメタデータを取得することは可能ですか?
format=json
を使用しようとしても機能しません。これが私が試したものです:
http://odata.informea.org/services/odata.svc/$metadata/?format=json
$metadata
ドキュメントはCSDL形式であり、現在XML表現しかありません。 (補足として、別の種類のODataペイロードのjson形式をリクエストする場合は、format
クエリトークンに$
その前:$format=json
。)
したがって、それは不可能です。ただし、$ metadataドキュメントのサブセットであるJSONでサービスドキュメントを取得できます。
http://odata.informea.org/services/odata.svc?$format=json
これにはタイプ情報はありませんが、サービスの利用可能なエントリポイント(つまり、エンティティセット)が一覧表示されます。
?$format=json
の代わりに、次の2つのヘッダーを設定することもできます。
Accept: application/json
Content-Type: application/json; charset=utf-8
必要なOdataの最小バージョンがどれであるかはわかりませんが、これは、Odata v4を使用するMicrosoft Dynamics NAV 2016では完全に機能します。
私は、メタデータから必要な情報の一部を解析する単純なプロバイダーを作成しました。自由に拡張してください。まず、いくつかの単純なモデルが必要です。データを表現するには、そこから醜い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;
});
});
}
}
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);
}
});
私は前の答えに同意しました。これは仕様ではサポートされていませんが、一部のODataフレームワーク/ライブラリはこの機能を実装しようとしています。
オリンゴについて考えます。これは、サーバー側も実装する場合に役立ちます。詳細については、Olingo JIRAでこの問題を参照してください。
それがあなたを助けることを願っています、ティエリー