Share via


Utiliser le point de terminaison OData avec les ressources Web Ajax et JScript

 

Date de publication : novembre 2016

S’applique à : Dynamics CRM 2015

Le point de terminaison OData vous permet d’interagir avec les données Mise à jour de Microsoft Dynamics CRM 2015 et de Microsoft Dynamics CRM Online 2015 à l’aide des bibliothèques JavaScript. Vous créez des ressources Web de script en utilisant des fichiers qui définissent les bibliothèques JavaScript. Vous associez ensuite les fonctions des bibliothèques aux gestionnaires d’événements de formulaire ou de champ ou aux actions de la commande du ruban. Vous pouvez les utiliser comme vous le feriez avec toute autre bibliothèque JavaScript dans les ressources Web (HTML) d’une page Web.

Contenu de la rubrique

Ajax

Tunnelage de méthode via POST

Accéder à l’URL du serveur

Utiliser XmlHttpRequest

Utiliser jQuery

Utiliser les dates

Ajax

AJAX (JavaScript et XML asynchrones) est une technique de développement Web utilisée pour créer des applications Web interactives. Les demandes du serveur sont effectuées à partir du navigateur en arrière-plan à l’aide d’un objet XmlHttpRequest. Bien que vous puissiez envoyer des demandes synchrones, la pratique recommandée consiste à envoyer des demandes asynchrones. Les demandes asynchrones requièrent deux fonctions JScript, une fonction pour envoyer la demande et une deuxième fonction de « rappel » pour traiter une réponse.

JSON

Le format JSON (JavaScript Object Notation) est utilisé pour sérialiser et transmettre des données structurées de la même manière que XML est généralement utilisé. À l’instar de XML, il est basé sur du texte et conçu pour être lisible. Pour convertir des objets JavaScript ordinaires au format JSON, vous utilisez la méthode JSON.stringify. Étant donné que le texte au format JSON définit des objets JavaScript, il peut être converti en objets JavaScript à l’aide de la méthode eval. Toutefois, cette pratique crée des vulnérabilités de sécurité. Vous devez utiliser la méthode JSON.parse à la place.

XmlHttpRequest

XmlHttpRequest (parfois appelé XHR) fournit des fonctionnalités permettant de configurer et d’envoyer des demandes et de définir une fonction de rappel si la demande est asynchrone. La réponse HTTP du serveur comprend un code de statut qui indique si la demande a réussi. Les valeurs de code de statut HTTP comprises dans la plage 200 sont considérées comme réussies.

Un objet XmlHttpRequest fournit des instructions au serveur sur le format des données à inclure dans la réponse. Étant donné que le point de terminaison ODATA prend en charge les formats ATOM et JSON, vous pouvez demander à ce que les données soient retournées au format XMLATOM. Cependant, avec le code JavaScript, la demande standard attendue utilise JSON, car ce format est facilement utilisable avec JavaScript.

Tunnelage de méthode via POST

Le protocole OData utilise moins les verbes HTTP courants PUT et DELETE ainsi que la définition d’un nouveau verbe : MERGE. Selon les bibliothèques de prise en charge que vous utilisez, vous pouvez rencontrer des problèmes lors de l’utilisation de ces verbes. La solution pour contourner ce problème consiste à utiliser le verbe POST et à spécifier un en-tête HTTPX-HTTP-Method avec l’action souhaitée. Utilisez la méthode setRequestHeader pour remplacer l’action spécifiée dans XmlHttpRequest.

Accéder à l’URL du serveur

La première action à effectuer lorsque vous commencez à utiliser le point de terminaison ODATA avec JavaScript consiste à établir l’URL sur l’URL racine de l’organisation. Utilisez la fonction getClientUrl de l’objet de contexte.

Utiliser XmlHttpRequest

jQuery est une bibliothèque efficace avec une variété d’utilisations, mais l’utilisation de jQuery n’est pas une condition préalable à l’exécution d’opérations à l’aide du point de terminaison ODATA pour Microsoft Dynamics 365. Nous vous déconseillons d’utiliser jQuery dans les scripts de formulaire ou de commande qui s’exécutent dans les pages d’application. Utilisez XmlHttpRequest directement sans avoir à charger la bibliothèque jQuery.jQuery**$.ajax** utilise XmlHttpRequest disponible dans le navigateur. L’utilisation directe de cet objet est légèrement différente de l’utilisation de $.ajax. Si vous avez l’habitude d’utiliser XMLHttpRequest, vous devez continuer à l’utiliser. Si vous avez toujours utilisé jQuery, envisagez d’utiliser directement XMLHttpRequest.Pour plus d'informations :Objet XMLHttpRequest

Avec XmlHttpRequest, vous créez un gestionnaire d’événements pour l’événement onreadystatechange et détectez quand la demande est terminée. Dans le gestionnaire d’événements, activez le code de statut retourné pour déterminer si la demande a réussi. Enfin, utilisez les méthodes open et send. L’exemple de code suivant utilise XmlHttpRequest pour créer un enregistrement de compte.

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);
        }
    }
};

Pour plus d’exemples avec XMLHttpRequest, consultez Exemple : créer, extraire, mettre à jour et supprimer le point de terminaison OData avec JavaScript

Utiliser jQuery

jQuery est une bibliothèque JavaScript populaire fournie avec les projets d'application Web dans Microsoft Visual Studio.jQuery fournit une structure étendue d'objets et de fonctions qui vous permettent d'interroger et d'utiliser des pages HTML avec JavaScript. Pour utiliser XMLHttpRequest, jQuery fournit la méthode jQuery.ajax.

Notes

Nous vous déconseillons d’utiliser jQuery avec les commandes ou les scripts de formulaire.Pour plus d'informations :Utiliser jQuery.

L’objet jQuery est référencé avec le caractère $ ; par conséquent, la forme abrégée pour jQuery.ajax est $.ajax. La méthode ajax est généralement utilisée avec une syntaxe impérative et la demande est envoyée dès que l’objet est instancié. L’exemple de code suivant crée un enregistrement de compte.

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);
    }
});

Le tableau suivant répertorie les propriétés que vous devrez connaître pour traiter les demandes et les réponses HTTP à l’aide du point de terminaison ODATA pour Microsoft Dynamics 365.

Nom de propriété

Type

Commentaires

type

string

Utilisez GET lorsque vous récupérez des données et POST pour toutes les autres opérations.Pour plus d'informations :Définir explicitement l’en-tête de demande sur une action HTTP différente

contentType

string

Spécifie le type de contenu envoyé au serveur. Utilisez application/json; charset=utf-8 lorsque vous envoyez des données au format JSON.

dataType

string

Type de données attendues à retourner par le serveur. Utiliser des json

Notes

La simple définition de cette propriété peut être insuffisante.Pour plus d'informations :Définir explicitement l’en-tête de demande pour accepter JSON

data

object

Affectez à ce paramètre la valeur d’un objet JSON pour les opérations de création ou de mise à jour.

url

string

URL du point de terminaison ODATA appropriée pour l’action que vous effectuez.

beforeSend

function

Fonction qui vous permet de modifier l’objet XMLHttpRequest avant son envoi.

success

function

Fonction de rappel lorsqu’une demande aboutit.Pour plus d'informations :Traiter les résultats

error

function

Fonction à appeler si une demande échoue.Pour plus d'informations :Gérer les erreurs

Pour plus d'informations, voir Exemple : créer, extraire, mettre à jour et supprimer le point de terminaison OData avec JavaScript et jQuery.

Définir explicitement l’en-tête de demande pour accepter JSON

Lorsque vous attendez des résultats au format JSON, la définition de la propriété dataType risque de ne pas fonctionner. Vous pouvez utiliser la propriété beforeSend pour définir explicitement les en-têtes sur XMLHttpRequest pour retourner les données au format JSON. Cette opération est généralement effectuée à l’aide d’une fonction anonyme, comme illustré dans l’exemple suivant.

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

Lorsqu’elles sont spécifiées, les erreurs dans XMLHttpRequest.responseText sont mises en forme au format JSON au lieu du format XML.

Conseil

Même si vous n’attendez pas que des données soient retournées, le fait de spécifier que les résultats sont toujours retournés avec JSON simplifie la gestion des erreurs.Pour plus d'informations :Gérer les erreurs

Définir explicitement l’en-tête de demande sur une action HTTP différente

Comme décrit dans Tunnelage de méthode via POST, lorsque vous effectuez une action qui requiert une action HTTP autre que POST ou GET, utilisez POST et la propriété beforeSend pour définir explicitement les en-têtes sur XMLHttpRequest pour effectuer une action différente. Cette opération est généralement effectuée à l’aide d’une fonction anonyme, comme illustré dans l’exemple suivant.

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

Gérer les erreurs

Lorsqu’une demande échoue, $.ajax transmet les trois arguments ci-après à une fonction définie dans la propriété d’erreur.

  • XMLHttpRequest
    Objet XMLHttpRequest.

  • textStatus
    Chaîne qui décrit le type d’erreur qui s’est produite. Les valeurs possibles sont les suivantes :

    • null

    • timeout

    • error

    • notmodified

    • parsererror

  • errorThrown
    Objet d’exception facultatif.

L’exemple suivant montre comment transmettre ces arguments à une fonction centrale qui gère les erreurs.

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

L’exemple suivant illustre une fonction simple qui capture le message d’erreur et affiche le résultat à l’aide de la fonction showMessage.

Notes

Cette fonction requiert que les détails de l’erreur soient retournés au format JSON. À moins que la méthode $.ajax soit configurée pour retourner des résultats avec JSON, XMLHttpRequest.responseText serait XML.

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

Traiter les résultats

Lorsque vous effectuez des opérations POST ou GET, vous pouvez vous attendre à ce que les données soient retournées. Si vous avez spécifié que les résultats soient retournés au format JSON, ceux-ci seront dans la propriété d de l’objet de données retourné. Lorsque vous créez ou récupérez un enregistrement à l’aide de l’identificateur unique, d représente les données de l’enregistrement. Dans tous les autres cas, d est un tableau.

L’exemple suivant illustre le traitement des résultats d’une requête qui retourne plusieurs enregistrements de compte.

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

Utiliser les dates

Il existe quatre tâches impliquant les dates que vous devrez peut-être effectuer :

  • Analyser les données récupérées

  • Afficher les valeurs de date

  • Mettre à jour les valeurs de date

  • Définir une date comme critère de filtre dans une requête

Analyser les données récupérées

Lorsque vous récupérez des enregistrements à l’aide du point de terminaison ODATA, les valeurs de date sont retournées en tant que chaînes qui utilisent le format « \/Date(<ticks>)\/ », où <ticks> correspond au nombre de millisecondes depuis le 1er janvier 1970 à minuit. Par exemple : "\/Date(1311170400000)\/". Toutes les valeurs retournées par Microsoft Dynamics 365 représentent les valeurs UTC ; par conséquent, aucune information de décalage n’est incluse.

Deux stratégies vous permettent d’analyser les dates dans les enregistrements retournés à l’aide du point de terminaison ODATA :

  • Utiliser une fonction reviver avec la méthode JSON.parse

  • Utiliser String.replace pour générer une valeur de date à partir d’une chaîne

Utiliser une fonction reviver avec la méthode JSON.parse

La méthode JSON.parse prend en charge un argument reviver facultatif, comme décrit dans la Documentation de la méthode JSON.parse sur MSDN. L’exemple suivant convertit les valeurs de chaîne correspondant à un modèle défini dans une expression régulière en objets Date.

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;
};

Notes

Ce code suppose que les valeurs de date soient toujours des valeurs de date UTC et ne contiennent pas d’informations de décalage.

Utiliser String.replace pour générer une valeur de date à partir d’une chaîne

Si vous n’utilisez pas l’argument reviver avec la méthode JSON.parse, l’exemple suivant montre comment générer une valeur Date à partir d’une chaîne.

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

Afficher les valeurs de date

Une fois que les valeurs de date de chaîne sont converties en objets Date, vous pouvez utiliser une variété de méthodes JavaScript, ou créer votre propre méthode, pour afficher la date sous forme de chaîne dans une interface utilisateur. Étant donné que l’objet Date de JavaScript est compatible UTC, les dates affichées dans votre interface utilisateur à l’aide des méthodes telles que toString ou toLocaleString reflètent les paramètres de fuseau horaire du système d’exploitation de l’utilisateur.

Toutefois, notez que les valeurs dans votre application peuvent être différentes de celles affichées dans Microsoft Dynamics 365, qui ne dépend pas des paramètres de fuseau horaire du système d’exploitation de l’utilisateur. Ces valeurs sont différentes lorsque les préférences de fuseau horaire du système d'exploitation de l'utilisateur ne correspondent pas à celles enregistrées dans Microsoft Dynamics 365.Microsoft Dynamics 365 permet également de définir des options de présentation personnalisées qui ne sont pas appliquées à l'aide de fonctions de date JavaScript standard comme toString.

Si vous souhaitez rapprocher les valeurs de date et d’heure affichées pour correspondre aux valeurs affichées dans Microsoft Dynamics 365, vous pouvez interroger les données stockées dans l’entité UserSettings et les entités telles que TimeZoneDefinition et TimeZoneRule pour créer des fonctions pour afficher les dates correspondant aux préférences de l’utilisateur.Microsoft Dynamics 365 ne fournit pas de fonctions pour effectuer ces actions.

Mettre à jour les valeurs de date

Lorsque vous modifiez les valeurs d’une date JavaScript à l’aide de méthodes de définition standard telles que setMinutes ou setHours, ces modifications s’appliquent à l’heure locale de l’utilisateur. Lorsque vous sauvegardez l’enregistrement, les valeurs UTC réelles sont sérialisées et enregistrées dans Microsoft Dynamics 365. Aucune action n’est nécessaire pour convertir les dates en une valeur UTC.

Lorsqu’une Date est sérialisée, le format est différent du format utilisé lors de la récupération des données. Comme indiqué dans Analyser les données récupérées, les dates sont récupérées sous forme de chaînes qui utilisent le format "\/Date(1311179400000)\/". Lorsque vous examinez les résultats de JSON.stringify pour retourner les valeurs de date au serveur, le format est "2013-07-20T16:30:00Z".

Définir une date comme critère de filtre dans une requête

Lorsque vous utilisez une valeur de date avec une option de requête système $filter, vous devez utiliser une date UTC. Pour convertir un objet DateJavaScript au format attendu pour un filtre, vous devez traiter la date à l’aide d’une fonction, comme dans l’exemple ci-après. Le résultat est une chaîne qui correspond au format suivant : 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;
}

Voir aussi

Utiliser le point de terminaison OData avec les ressources Web
OData endpoint Http status codes
Bibliothèques JavaScript pour Microsoft Dynamics CRM 2015
Ressources Web de script (JScript)
Associer des fonctions aux événements de formulaire et de champ
Méthode jQuery.ajax
Objet XMLHttpRequest
Article technique : Utilisation des options de groupe d’options avec le point de terminaison ODATA - JScript

© 2017 Microsoft. Tous droits réservés. Copyright