Delen via


Het OData-eindpunt gebruiken met Ajax- en JScript-webresources

 

Gepubliceerd: november 2016

Is van toepassing op: Dynamics CRM 2015

Dankzij het OData-eindpunt kunt u werken met Microsoft Dynamics CRM 2015 en Microsoft Dynamics CRM Online 2015 Update-gegevens door JavaScript-bibliotheken te gebruiken. U maakt scriptwebresources met behulp van bestanden die de JavaScript-bibliotheken definiëren. Vervolgens koppelt u functies in de bibliotheken aan formulier- of veldgebeurtenishandlers of lintopdrachtacties. U kunt deze net als andere JavaScript-bibliotheken gebruiken binnen webpaginawebresources (HTML).

In dit onderwerp

Ajax

Methodetunneling met POST

Toegang krijgen tot de server-URL

XMLHttpRequest gebruiken

jQuery gebruiken

Werken met datums

Ajax

AJAX (asynchroon JavaScript en XML) is een webontwikkelingstechniek die wordt gebruikt om interactieve webtoepassingen te maken. Serveraanvragen worden gedaan vanuit de browser op de achtergrond met behulp van een XmlHttpRequest-object. U kunt synchrone aanvragen verzenden, maar de aanbevolen methode is asynchrone aanvragen te verzenden. Asynchrone aanvragen vereisen twee JScript-functies, één om de aanvraag te verzenden en een tweede "callback"-functie om een respons te verwerken.

JSON

De JavaScript Object Notation-indeling (JSON) wordt gebruikt voor het serialiseren en overbrengen van gestructureerde gegevens, op grotendeels dezelfde manier als waarop XML meestal wordt gebruikt. Net als XML is het tekstgebaseerd en ontworpen om leesbaar te zijn voor mensen. Als u normale JavaScript-objecten naar de JSON-indeling wilt converteren, gebruikt u de methode JSON.stringify. Aangezien de tekst in JSON JavaScript-objecten definieert, kan de tekst naar JavaScript-objecten worden geconverteerd met behulp van de methode eval. Deze methode leidt echter tot beveiligingskwetsbaarheden. U zou in plaats daarvan de methode JSON.parse moeten gebruiken.

XmlHttpRequest

XmlHttpRequest (som XHR genoemd) biedt mogelijkheden om aanvragen te configureren en te verzenden en een callbackfunctie te definiëren als de aanvraag asynchroon is. De respons HTTP van de server bevat een statuscode die aangeeft of de aanvraag is geslaagd.HTTP waarden voor de statuscode in het bereik 200 worden gezien als geslaagd.

Een XmlHttpRequest bevat instructies voor de server over de indeling van gegevens die in de respons moeten worden opgenomen. Aangezien het ODATA-eindpunt zowel de indeling ATOM als JSON ondersteunt, kunt u verzoeken dat gegevens worden geretourneerd in de indeling XMLATOM. Met JavaScript-code gebruikt de verwachte, gebruikelijke aanvraag echter JavaScript, omdat dat gemakkelijk bruikbaar is met JSON.

Methodetunneling met POST

Het OData-protocol gebruikt minder algemene HTTP-verbs PUT en DELETE en definieert een nieuwe verb: MERGE. Afhankelijk van de ondersteunende bibliotheken die u gebruikt, kunt u problemen ondervinden bij het gebruik van deze verbs. De manier om dit op te lossen is de verb POST te gebruiken en een X-HTTP-MethodHTTP-koptekst op te geven met de gewenste actie. Gebruik de methode setRequestHeader om de actie te negeren die is opgegeven in de XmlHttpRequest.

Toegang krijgen tot de server-URL

Het eerste wat u moet doen als u het ODATA-eindpunt gebruikt met JavaScript is de URL creëren voor de organisatieroot. URL Gebruik de functie getClientUrl vanuit het contextobject.

XMLHttpRequest gebruiken

jQuery is een handige bibliotheek met een verscheidenheid aan gebruik, maar het gebruik van jQuery is geen vereiste voor het uitvoeren van bewerkingen met het ODATA-eindpunt voor Microsoft Dynamics 365. We raden aan geen gebruik te maken van jQuery in formulierscripts of opdrachtscripts die worden uitgevoerd in toepassingspagina's, maar de XmlHttpRequest rechtstreeks te gebruik en te voorkomen dat u de jQuery-bibliotheek moet laden.jQuery**$.ajax** gebruikt XmlHttpRequest beschikbaar in de browser. Dit object rechtstreeks gebruiken wijkt licht af van het gebruik van $.ajax. Als u al bekend bent met het gebruik van XMLHttpRequest, kunt u het blijven gebruiken. Als u altijd jQuery hebt gebruikt, kunt u overwegen XMLHttpRequest direct te gebruiken.Meer informatie:XMLHttpRequest-object

Met XmlHttpRequest maakt u een gebeurtenishandler voor de gebeurtenis onreadystatechange en detecteert u wanneer de aanvraag is voltooid. Controleer in de gebeurtenishandler de statuscode die wordt geretourneerd om te bepalen of de aanvraag is geslaagd. Gebruik ten slotte de methoden open en send. Het volgende voorbeeld gebruikt XmlHttpRequest om een nieuwe accountrecord te maken.

var account = {};
    account.Name = "Sample Account";
    var jsonAccount = JSON.stringify(account);

    var createAccountReq = new XMLHttpRequest();
    createAccountReq.open("POST", Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc/AccountSet", true);
    createAccountReq.setRequestHeader("Accept", "application/json");
    createAccountReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    createAccountReq.onreadystatechange = function () {
        createAccountReqCallBack(this);
    };
    createAccountReq.send(jsonAccount);

function createAccountReqCallBack(createAccountReq) {
    if (createAccountReq.readyState == 4 /* complete */) {
        createAccountReq.onreadystatechange = null; //avoids memory leaks
        if (createAccountReq.status == 201) {
            //Success
            var newAccount = JSON.parse(createAccountReq.responseText).d;
        }
        else {
            //Failure
            errorHandler(createAccountReq);
        }
    }
};

Voor meer voorbeelden van het gebruik van XMLHttpRequest raadpleegt u Voorbeeld: Maken, ophalen, bijwerken en verwijderen via het OData-eindpunt met JavaScript

jQuery gebruiken

jQuery is een populaire JavaScript-bibliotheek met webtoepassingprojecten in Microsoft Visual Studio.jQuery biedt een uitgebreide structuur met objecten en functies waarmee u query's kunt opstellen en kunt werken met HTML-pagina's met JavaScript. Voor gebruik van XMLHttpRequest biedt jQuery de methode jQuery.ajax.

Notitie

We adviseren niet jQuery te gebruiken met formulierscripts of opdrachten.Meer informatie:jQuery gebruiken.

Naar het jQuery-object wordt verwezen met het teken $, dus de korte vorm voor jQuery.ajax is $.ajax. De methode ajax wordt veel gebruikt met een imperatieve syntaxis en de aanvraag wordt verzonden zodra een exemplaar van het object is gemaakt. Het volgende voorbeeld maakt een nieuwe accountrecord.

var account = {};
account.Name = "Sample Account";
var jsonAccount = window.JSON.stringify(account);
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    datatype: "json",
    url: Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc/AccountSet",
    data: jsonAccount,
    beforeSend: function (XMLHttpRequest) {
        //Specifying this header ensures that the results will be returned as JSON.
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
    },
    success: function (data, textStatus, XmlHttpRequest) {
        account = data.d;
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        errorHandler(XMLHttpRequest, textStatus, errorThrown);
    }
});

De volgende tabel bevat de eigenschappen die u moet kennen om HTTP-aanvragen en -reacties te verwerken met het ODATA-eindpunt voor Microsoft Dynamics 365.

Eigenschapsnaam

Type

Opmerkingen

type

string

Gebruik GET wanneer u gegevens opvraagt en POST voor alle andere bewerkingen.Meer informatie:De aanvraagkoptekst expliciet instellen op een andere HTTP-actie

contentType

string

Geeft het type inhoud op dat aan de server wordt verzonden. Gebruik application/json; charset=utf-8 wanneer u gegevens verzendt in de JSON-indeling.

dataType

string

Het type verwachte gegevens dat door de server wordt geretourneerd.json gebruiken.

Notitie

Gewoon deze eigenschap instellen kan onvoldoende zijn.Meer informatie:De aanvraagkoptekst expliciet instellen op het accepteren van JSON

data

object

Stel dit in op de waarde van een JSON-object voor maak- en bijwerkbewerkingen.

url

string

De ODATA-eindpunt-URL voor de actie die u uitvoert.

beforeSend

function

Een functie waarmee u het XMLHttpRequest-object kunt wijzigen voordat het wordt verzonden.

success

function

Een callbackfunctie als een aanvraag slaagt.Meer informatie:Resultaten verwerken

error

function

Een functie die wordt aangeroepen als een aanvraag mislukt.Meer informatie:Fouten afhandelen

Zie Voorbeeld: Maken, ophalen, bijwerken en verwijderen via het OData-eindpunt met JavaScript en jQuery voor meer informatie.

De aanvraagkoptekst expliciet instellen op het accepteren van JSON

Wanneer u de resultaten verwacht in een JSON-indeling, werkt alleen het instellen van de eigenschap dataType mogelijk niet. U kunt de eigenschap beforeSend gebruiken om de kopteksten expliciet op XMLHttpRequest int e stellen om gegevens te retourneren als JSON. Dat wordt meestal gedaan door een anonieme functie uit te voeren, zoals in het volgende voorbeeld.

beforeSend: function (XMLHttpRequest) {
   //Specifying this header ensures that the results will be returned as JSON.
   XMLHttpRequest.setRequestHeader("Accept", "application/json");}

Als dit is opgegeven, worden fouten in XMLHttpRequest.responseText opgemaakt in JSON in plaats van in XML.

Tip

Zelfs als u niet verwacht dat gegevens worden geretourneerd, vereenvoudigt opgeven dat de resultaten altijd moeten worden geretourneerd met JSON de foutafhandeling.Meer informatie:Fouten afhandelen

De aanvraagkoptekst expliciet instellen op een andere HTTP-actie

Zoals beschreven in Methodetunneling met POST, als u een actie uitvoert die een andere HTTP-actie beschrijft dan POST of GET, gebruikt u POST en de eigenschap beforeSend om de kopteksten in de XMLHttpRequest expliciet in te stellen om een andere actie uit te voeren. Dat wordt meestal gedaan door een anonieme functie uit te voeren, zoals in het volgende voorbeeld.

beforeSend: function (XMLHttpRequest) {
   //Specify the HTTP method DELETE to perform a delete operation.
   XMLHttpRequest.setRequestHeader("X-HTTP-Method", "DELETE");
}

Fouten afhandelen

Wanneer een aanvraag niet is geslaagd is, geeft $.ajax de volgende drie argumenten door aan een functie die is ingesteld in de fouteigenschap.

  • XMLHttpRequest
    Het XMLHttpRequest-object.

  • textStatus
    Een tekenreeks die het type fout beschrijft dat is opgetreden. Mogelijke waarden zijn als volgt:

    • null

    • timeout

    • error

    • notmodified

    • parsererror

  • errorThrown
    Een optioneel uitzonderingsobject.

Dit voorbeeld laat zien hoe u deze argumenten doorgeeft aan een centrale functie die fouten beheert.

error: function (XMLHttpRequest, textStatus, errorThrown) {
   errorHandler(XMLHttpRequest, textStatus, errorThrown);
}

Dit voorbeeld laat een eenvoudige functie zien die het foutbericht vastlegt en het resultaat weergeeft met de functie showMessage.

Notitie

Deze functie verwacht dat eventuele foutdetails worden geretourneerd in de JSON-indeling. Tenzij de methode $.ajax is geconfigureerd om resultaten te retourneren met JSON, moet de XMLHttpRequest.responseTextXML zijn.

function errorHandler(XMLHttpRequest, textStatus, errorThrown)
{ showMessage("Error : " + textStatus + ": " + JSON.parse(XMLHttpRequest.responseText).error.message.value); }

Resultaten verwerken

Als u POST- of GET-bewerkingen uitvoert, kunt u verwachten dat gegevens worden geretourneerd. Als u hebt opgegeven dat resultaten worden geretourneerd in de JSON-indeling, bevinden de resultaten zich in de eigenschap d van het gegevensobject dat wordt geretourneerd. Wanneer u een record maakt of ophaalt met de unieke id, vertegenwoordigt d de gegevens voor de record. In elk ander geval is d een matrix.

Het volgende voorbeeld toont de verwerking van de resultaten van een query die meerdere accountrecords retourneert.

success: function (data, textStatus, XmlHttpRequest) {
   var accounts = data.d;
   for (var i in accounts) {   showMessage(accounts[i].Name);
   }}

Werken met datums

Er zijn vier taken met betrekking tot datums die u mogelijk moet uitvoeren:

  • Opgehaalde gegevens parseren

  • Datumwaarden weergeven

  • Datumwaarden bijwerken

  • Een datum als criterium instellen in een filter in een query

Opgehaalde gegevens parseren

Als u records ophaalt met het ODATA-eindpunt, worden datumwaarden geretourneerd als tekenreeksen met de indeling "\/Date(<ticks>)\/", waarbij <ticks> het aantal milliseconden sinds middernacht 1 januari 1970 is. Voorbeeld: "\/Date(1311170400000)\/". Alle waarden die worden geretourneerd uit Microsoft Dynamics 365, vertegenwoordigen de UTC-waarden (Coordinated Universal Time), dus er wordt geen verschuiving opgenomen.

Er zijn twee strategieën die u kunt gebruiken om datums te parseren die worden geretourneerd met het ODATA-eindpunt:

  • Een reviverfunctie gebruiken met de JSON.parse-methode

  • Gebruik String.replace om een datumwaarde te genereren uit een tekenreeks

Een reviverfunctie gebruiken met de JSON.parse-methode

De methode JSON.parse ondersteunt een optioneel reviverargument, zoals beschreven in de documentatie van de methode JSON.parse op MSDN. Hier volgt een voorbeeld dat de tekenreekswaarden met een patroon dat is gedefinieerd in een gewone expressie, converteert naar Date-objecten.

var jsontext = '{ "hiredate": "\/Date(1311170400000)\/", "birthdate": "\/Date(-158342400000)\/" }';
var dates = JSON.parse(jsontext, dateReviver);
var string = dates.hiredate.toUTCString();
// The value of string is "Wed, 20 Jul 2011 14:00:00 UTC"

function dateReviver(key, value) {
 var a;
 if (typeof value === 'string') {
  a = /Date\(([-+]?\d+)\)/.exec(value);
  if (a) {
   return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
  }
 }
 return value;
};

Notitie

Deze code gaat ervan uit dat gegevenswaarden altijd UTC zijn en geen verschuivingsinformatie bevatten.

Gebruik String.replace om een datumwaarde te genereren uit een tekenreeks

Als u het reviverargument niet gebruikt met de methode JSON.parse, toont het volgende voorbeeld hoe u een Date-waarde genereert uit een tekenreeks.

var dateValue = new Date(parseInt(stringDateValue.replace("/Date(", "").replace(")/", ""), 10));

Datumwaarden weergeven

Nadat de tekenreekswaarden zijn geconverteerd naar Date-objecten, kunt u allerlei JavaScript-methoden gebruiken of uw eigen methoden maken om de datum weer te geven als een tekenreeks in een gebruikersinterface. Aangezien het JavaScriptDate-object UTC-bewust is, reflecteren de datums die in uw gebruikersinterface worden weergegeven met methoden zoals toString of toLocaleString de tijdzone-instellingen van het besturingssysteem van de gebruiker.

De waarden in uw toepassing kunnen echter afwijken van dezelfde waarden die worden weergegeven in Microsoft Dynamics 365, waar niet wordt vertrouwd op de tijdzone-instellingen van het besturingssysteem van de gebruiker. Deze waarden zijn anders als de voorkeuren van de besturingssysteemtijdzone van de huidige gebruiker niet overeenkomen met de tijdzonevoorkeur die is opgeslagen in Microsoft Dynamics 365.Microsoft Dynamics 365 staat ook persoonlijke instellingen voor presentatieopties toe die niet worden toegepast door het gebruiken standaard JavaScript-datumfuncties zoals toString.

Als u de weergegeven datum- en tijdwaarden wilt afstemmen op de waarden die worden weergegeven in Microsoft Dynamics 365, kunt u gegevens opvragen die zijn opgeslagen in de entiteit UserSettings en in entiteiten zoals TimeZoneDefinition en TimeZoneRule om functies te maken om datums weer te geven die overeenkomen met de voorkeur van de gebruiker.Microsoft Dynamics 365 biedt geen functies om deze acties uit te voeren.

Datumwaarden bijwerken

Als u de waarden van een JavaScript-datum wijzigt met behulp van standaardmethoden zoals setMinutes of setHours, zijn deze wijzigingen in de lokale tijd van de gebruiker. Wanneer u de record opslaat, worden de werkelijke UTC-waarden geserialiseerd en weer opgeslagen in Microsoft Dynamics 365. U hoeft niets te doen om de datums te converteren naar een UTC-waarde.

Als een Date wordt geserialiseerd, verschilt de indeling van de indeling die is gebruikt toen de gegevens werden opgehaald. Zoals gezegd in Opgehaalde gegevens parseren, gebruiken datums die als tekenreeksen worden opgehaald, de indeling "\/Date(1311179400000)\/". Wanneer u de resultaten van JSON.stringify bekijkt voor datumwaarden die terug worden gegeven aan de server, is de indeling "2013-07-20T16:30:00Z".

Een datum als criterium instellen in een filter in een query

Wanneer u een datumwaarde gebruikt met een systeemqueryoptie in $filter, moet u een UTC-datum gebruiken. Als u een JavaScriptDate-object wilt converteren naar de indeling die wordt verwacht voor een filter, moet u de datum verwerken met een functie zoals in het volgende voorbeeld. Het resultaat is een tekenreeks met de volgende indeling: datetime'2010-09-28T18:21:46:594Z'.

function getODataUTCDateFilter(date) {

 var monthString;
 var rawMonth = (date.getUTCMonth()+1).toString();
 if (rawMonth.length == 1) {
  monthString = "0" + rawMonth;
 }
 else
 { monthString = rawMonth; }

 var dateString;
 var rawDate = date.getUTCDate().toString();
 if (rawDate.length == 1) {
  dateString = "0" + rawDate;
 }
 else
 { dateString = rawDate; }


 var DateFilter = "datetime\'";
 DateFilter += date.getUTCFullYear() + "-";
 DateFilter += monthString + "-";
 DateFilter += dateString;
 DateFilter += "T" + date.getUTCHours() + ":";
 DateFilter += date.getUTCMinutes() + ":";
 DateFilter += date.getUTCSeconds() + ":";
 DateFilter += date.getUTCMilliseconds();
 DateFilter += "Z\'";
 return DateFilter;
}

Zie ook

Het OData-eindpunt gebruiken met webresources
OData endpoint Http status codes
JavaScript-bibliotheken voor Microsoft Dynamics CRM 2015
Scriptwebresources (JScript)
Koppel functies aan formulier- en veldgebeurtenissen
jQuery.ajax-methode
XMLHttpRequest Object
Technisch Artikel: Optieset-opties gebruiken met het ODATA-eindpunt - JScript

© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht