Dieser Artikel wurde maschinell übersetzt.

Data Points

Erstellen und Verwenden von JSON-Format promoveaza

Julie Lerman

Julie LermanIn meinem Artikel vom Juni "Daten binden promoveaza im Web Apps mit Knockout.js" (msdn.microsoft.com/magazine/jj133816), ich hatte Spaß mit Knockout.js und promoveaza.Als ich erfuhr wie an Daten binden Knockout zu den Ergebnissen des promoveaza Service, fand ich auch mehr über promoveaza und JSON als ich vorher gewußt hätte.Im Artikel dieses Monats werde ich mein Schwerpunkt verlagern, auf JSON aus promoveaza konsumieren und JSON-freundliche WCF Data Services erstellen.

Ich zeige Ihnen, wie JSON direkt aus JavaScript zu nutzen, wie das promoveaza JavaScript SDK (genannt Datajs) nutzen und so stellen Sie sicher, Ihren Feed ist flexibel genug, um jede Art von clientseitigen Programmierung zu unterstützen, die JSON benötigen.

Promoveaza ist eine Spezifikation dafür, dass Daten-Service-Consumern auf ein konsistentes Verhalten von den Diensten verlassen können, die sie verzehren.Eine der Regeln der Spezifikation ist, dass promoveaza Ergebnisse Ausgabe standardmäßig im ATOM-Format (die eine bestimmte Art der Formatierung XML), und dass es auch ausgeben kann im JSON-Format Ergebnisse.

Wie die promoveaza-Spezifikation entwickelt, stellt es neue Features, die Sie Benutzer Ihres Dienstes nutzen können.Nachdem ich die verschiedenen Möglichkeiten um zu konsumieren und JSON in promoveaza-Feeds zu erstellen diskutieren, ich werde dafür sorgen, dass Sie verstehen, wie bevorstehende Änderungen an den promoveaza Spezifikation Willen beeinflussen promoveaza und was Sie heute tun können, um vorbereitet zu sein.Verfügbarmachen ein Kunden mit dem folgenden Schema in meinen Dienst zunächst:

public class Customer
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string AccountNumber { get; set; }
}

Standardmäßig ein Kunden-Ergebnis von meinem Service wäre ATOM-Daten und Aussehen (wie von einem Browser formatiert), wie in Abbildung 1.

Results as ATOM
Abbildung 1 Ergebnisse als ATOM

Das gleiche Ergebnis ausgeben wie JSON wäre:

{"d":[
{"__metadata":{"id":"http://localhost:43447/DataService.svc/Customers(1)",
               "uri":"http://localhost:43447/DataService.svc/Customers(1)",
               "type":"DataAccessMSDNJuly2012.Customer"},
  "Id":1,
  "FirstName":"Julie",
  "LastName":"Lerman",
  "AccountNumber":"A123"}
]}

Wenn Sie mit dem raw ATOM oder JSON-Ergebnisse arbeiten, kann das Format der Ausgabe einen großen Unterschied in der Leichtigkeit der Codierung machen. Beispielsweise, wenn Sie den Feed in JavaScript verbraucht sind, ist es viel einfacher direkt mit ein JSON-Objekt zu arbeiten, als zu analysieren von XML.

Es gibt zwei Möglichkeiten, um sicherzustellen, Ihre Ergebnisse zurückkommen im JSON-Format: Sie können im Anforderungsheader Anwendung/Json angeben oder Sie können einen promoveaza-Abfrageparameter hinzufügen. Beim Verfassen Anfragen im Fiddler testen es ist ziemlich leicht um eine Kopfzeile hinzuzufügen, wie im Abbildung 2.

Specifying JSON in the Request Header
Abbildung 2 Angabe von JSON in der Anfrage-Header

Sie können auch einen Header in JQuery hinzufügen, wenn Sie Ihre Anfrage erstellen, aber dank ein paar andere Optionen, Sie nicht auf diese Länge zu gehen müssen. Eine dieser Optionen ist Datajs, die JavaScript-Bibliothek für promoveaza, zu verwenden, die viele andere Vorteile bietet für Programmieren mit promoveaza auch. Eine weitere Möglichkeit ist die Verwendung den promoveaza-Query-Parameter, $Format.

JSON standardmäßig mit Datajs zu erhalten

Sie können Datajs von datajs.codeplex.com. Seit der Zeit des Schreibens ist die aktuelle Version 1.0.3.

Wenn Sie Visual Studio verwenden, können Sie Datajs direkt an das Projekt mit Hilfe des NuGet Package Managers hinzufügen. NuGet fügen einen Ordner "Scripts" zu Ihrem Projekt und setzen Sie die aktuelle Version des Datajs (Datajs-1.0.3.js) und seine Verwandten min-Script-Dateien in diesem Ordner.

Skript-Bibliothek enthält eine Klasse namens promoveaza, das erleichtert das Lesen und Schreiben von promoveaza richtlinienkonformen Feeds und andere Features bietet. Obwohl Sie leicht einen Header in der Anforderung über die OData.read-Funktion einfügen können, ist es nicht notwendig. Standardmäßig werden Datajs automatisch Header hinzufügen, denn wenn Sie diese Bibliothek verwenden, es wahrscheinlich ist, Sie wollen JSON.

Hier ist einige JavaScript, die OData.read aufruft, übergibt die Uri, die meine Datendienstabfrage darstellt, und gibt an, was mit den Ergebnissen zu tun (in diesem Fall ich bin speichern die Ergebnisse in einer Variablen mit dem Namen Customer):

<script src="Scripts/datajs-1.0.2.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
  var customer;
  OData.read({ requestUri:"http://localhost:43447/DataService.svc/Customers?$top=1"
             },
             function (data, response) {
               customer = data.results[0];
             },
             function (err) {
               alert("Error occurred: " + err.message);
             });
</script>

Wie ich durch dieses Skript Debuggen, ich kann sehen, dass das Ergebnis der Abfrage ein Objekt, wie im Abbildung 3.

Debug View of JSON Result
Abbildung 3 Debug View von JSON-Ergebnis

Mit Fiddler ausgeführt, um HTTP-Datenverkehr zu erfassen kann ich sehen, dass der Accept-Header angeben Anwendung/Json, Teil dieser Anforderung war.

Wenn Sie ein PHP-Entwickler sind, sollten Sie die zugehörige Bibliothek, promoveaza SDK für PHP Auschecken (odataphp.codeplex.com). Ebenso wie die Datajs-Bibliothek für JavaScript-Entwickler, sichert die PHP-SDK die Ergebnisse relevant sind. Aber in diesem Fall es tut dies durch ATOM-Format anfordern und dann die resultierenden ATOM-Daten in PHP Objekte materialisieren.

JSON mit dem $Format Parameter anfordern

Nicht jeder braucht JSON wird die Datajs-Bibliothek nutzen. Aber das bedeutet nicht notwendigerweise, dass Sie zu den Anfrage-Header verwenden, um JSON bitten. Die promoveaza Spec hat auch ein Query-Parameter, $Format, die Json als einen seiner Werte akzeptiert.

Hier ist die geänderte Uri, die JSON direkt Anfragen:

http://localhost:43447/DataService.svc/Customers (1)?$ Format = Json

Sie können jede Abfrage $Format-Parameter hinzufügen. Ich bin hier die Format-Anforderung mit einem Filter kombinieren:

http://localhost:43447/DataService.svc/Customers?$Filter=FirstName Eq 'Julie' &$ Format = Json

Zwingt einen Datendienst, das $Format Parameter zu Ehren

Obwohl dieses Format-Parameter verwenden, um anzufordern, dass JSON ist Teil der promoveaza Spezifikation, weiß nicht alle Daten-Dienste wie den Parameter verarbeitet.In der Tat, wenn Sie einen WCF-Datendienst .net erstellen, gibt es ATOM standardmäßig.Während die $-Format akzeptieren = Json Parameter, ATOM wird noch in der Antwort zurückgegeben.Aber einige Entwickler im Team promoveaza haben gemeinsam eine einfache Lösung können Sie in Ihrer Anwendung, können hinzufügen, WCF Data Services verarbeiten die $ Befehl formatieren und JSON zurückgeben.

Die Erweiterung erfolgt in Form von einer Klasse namens JSONPSupportInspector und ein Attribut namens JSONP­SupportBehavior.Beide Klassen nutzen Logik von System.Component­Modell.Sie können die Klassen direkt zu Ihrem Projekt hinzufügen oder Erstellen einer Assembly aus zu verweisen.Sobald Ihre WCF Data Service Zugriff auf diese Klassen hat, alle Sie tun müssen, ist der Service-Klasse das JSONPSupportBehavior-Attribut hinzufügen wie folgt:

[JSONPSupportBehavior]
public class DataService : DataService<SalesContext>
{
  public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
    config.SetEntitySetAccessRule("Orders", EntitySetRights.All);
  }

Mit diesem Attribut an Stelle meinen Dienst reagiert auf die $Format = Json Parameter, wenn ich es in die Abfrage hinzufügen, und mein Service wird JSON zurück.

Ich schreibe diese Spalte auf den Fersen der April 2012 Version von WCF Data Services 5, die immer noch verlangt, dass Sie explizit die JSONP-Unterstützung in Ihrem Data Services hinzufügen. Wenn Sie eingewickelt in der WCF Data Services-API in der Zukunft sehen möchten, können Sie hinzufügen, eine Abstimmung, um des Teams UserVoice Feature Vorschläge an bit.ly/ImeTQt.

JSON-Unterstützung und promoveaza Versionen

Die promoveaza-Spezifikation liegt derzeit bei Version 2 und weiterentwickelt. Arbeit an Version 3 ist im Gange, mit Beta Dokumentation bereits unter OData.org. Standardmäßig wird Ihr WCF-Datendienst Version 1 Ziel. Leider funktioniert standardmäßig nicht, wenn Sie eine promoveaza-Version 2-Funktion, z. B. serverseitige Paging verwenden möchten, die in WCF Data Services verfügbar ist. Ich habe meinen Dienst zeigen die SetEntitySetPageSize Konfiguration hinzugefügt:

public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
    config.SetEntitySetAccessRule("Orders", EntitySetRights.All);
    config.SetEntitySetPageSize("Customers", 3);
  }

Mit dieser Version 2-Funktion vorhanden wird der Dienst eine Ausnahme auslösen und Ihnen sagen, dass MaxProtocolVersion größer als Version 1 angeben. Hier ist der Fehler der SetEntitySetPageSize-Konfiguration zugeordnet:

"Serverseitiges Paging kann nicht werden verwendet, wenn die MaxProtocol­Version des Datendiensts auf DataServiceProtocolVersion.V1 festgelegt ist."

Um das Problem zu beheben, ist es leicht genug, um die Version im Dienst-Code festgelegt:

public static void InitializeService(DataSeviceConfiguration config)
  {
    config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
    config.SetEntitySetAccessRule("Orders", EntitySetRights.All);
    config.SetEntitySetPageSize("Customers", 3);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }

Und in diesem Fall ist es immer noch möglich, JSON-Ausgabe in der Anfrage-Header oder mit Hilfe des Format-Parameters $ im Uri anzufordern.

Sie können jedoch Ihren Dienst aufwärtskompatibel, sein Design festlegen der MaxProtocolVersion auf DataServiceProtocol­Version.V3.Aber in Version 3 wird das JSON-Format zu einem strafferen Ausgabeformat als JSON Light verändert werden (bit.ly/JrM6RQ).Dies kann ein großes Problem sein, wenn die Clientanwendung nicht optimierte JSON-Format erwartet.Aus der Perspektive der verbrauchende Anwendung, erscheint es, dass die Anforderung für JSON ignoriert wurde da ATOM zurückgegeben wird und nicht JSON.

Denn Ihr Kunde muss explizit die ausführlichere Anforderungsformat oder geben Sie die promoveaza-Version zum Ziel ist.Ohne diese Regeln erfüllt wird der Dienst ATOM zurückgeben.Daher müssen Sie eine oder die andere der erforderlichen Aufgaben um JSON Ergebnisse zu bekommen, wenn der Dienst auf Version 3 festgelegt ist tun.

Hier ist eine Anfrage-Header geändert, um speziell das ausführliche Format der JSON anfordern:

Akzeptieren: Anwendung/Json; promoveaza = verbose

Und hier ist ein Beispiel für den Header mit einer bestimmten Anforderung, dass die Antwort promoveaza Version 2 Formatierung verwenden:

    Akzeptieren: Anwendung/json
    MaxDataServiceVersion: 2.0

Was passiert, wenn Sie verwenden das $Format = Json Parameter in der Abfrage anstelle von JSON in der Kopfzeile anfordern?Auch der Service wird nicht begreifen die Anforderung und werde, erhalten Sie eine Fehlermeldung, die besagt, dass der MIME-Typ nicht unterstützt wird.In diesem Fall müssen Sie die MaxDataServiceVersion in Ihre Anforderungsheader aufnehmen.

Jedoch, wenn Sie Datajs verwenden, Sie brauchen nicht zu sorgen.Beginnend mit Version 1.0.3, die Bibliothek ist die Notwendigkeit für die Versionsinformationen und liefert sie in ihren Anforderungen.In diesem Ort Ihr Service ist bereit für promoveaza Version 3 und Verbraucher haben die Flexibilität, unabhängig davon, welche Versionsformat anfordern, sie mögen.

JSON in der Pipeline promoveaza

Dank seiner optimierten Format ist JSON eine zunehmend wichtige Format für Entwickler.Vielleicht erinnern Sie sich, dass auch einige der neuen Dokument Datenbanken ich über in der Spalte November 2011 Datenpunkte schrieb "was zum Teufel Dokument Datenbanken sind?" (MSDN.Microsoft.com/Magazine/hh547103), Speicherdaten über JSON oder einige Torsion auf JSON.

Wenn Sie Artikel des letzten Monats Datenpunkte überprüfen, finden Sie Beispiele für Lesen und Schreiben von Datendiensten mit JSON und Knockout.js.

Als wir in ein Zeitalter wenn mehr Anwendungen getrennt sind bewegen, werden Sie schätzen die Möglichkeit, promoveaza als JSON verbrauchen (entweder ausführliche oder effizienter neuen Format).Und wenn Sie Dienste erstellen, Ihre Konsumenten werden sicherlich dankbar, wenn Sie ihnen Zugriff auf Ihre Daten auf diese Weise erleichtern können.

Julie Lerman ist Microsoft MVP, .NET-Mentor und Unternehmensberaterin und lebt in den Bergen von Vermont. Sie hält bei User Groups und Konferenzen in der ganzen Welt Vorträge zum Thema Datenzugriff und anderen Microsoft .NET-Themen. Julie Lerman führt einen Blog unter thedatafarm.com/blog und ist die Verfasserin von "Programming Entity Framework" (Programmieren des Entity Framework) (O’Reilly Media 2010) und "Programming Entity Framework: Code First" (Programmieren des Entity Framework: zuerst der Code) (O’Reilly Media, 2011). Folgen Sie ihr auf Twitter unter twitter.com/julielerman.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Alejandro Trigo