Utilisation de __REQUESTDIGEST
Lors de l’exécution de requêtes REST autres que GET sur l’API REST de SharePoint, vous devez inclure à votre requête un condensé valide de celle-ci. Le condensé prouve la validité de votre requête à SharePoint. Étant donné que ce jeton n’est valide que pendant une durée limitée, vous devez vous assurer que le jeton est valide avant de l’ajouter à votre demande, sinon la demande échoue.
Pour les pages classiques, SharePoint inclut un jeton de condensé de requête dans la page, dans un champ masqué appelé __REQUESTDIGEST. L’une des approches les plus communes pour produire un condensé de requête consiste à l’obtenir à partir de ce champ et à l’ajouter à la requête, par exemple :
var digest = $('#__REQUESTDIGEST').val();
$.ajax({
url: '/_api/web/...'
method: "POST",
headers: {
"Accept": "application/json; odata=nometadata",
"X-RequestDigest": digest
},
success: function (data) {
// ...
},
error: function (data, errorCode, errorMessage) {
// ...
}
});
Cette requête fonctionne pour un temps, mais si l’utilisateur laisse la page ouverte un peu plus longtemps, le condensé de requête expire dans la page et la requête échoue avec pour résultat HTTP 403 FORBIDDEN**. Par défaut, un jeton de condensé de requête reste valide pendant 30 minutes ; avant de l’utiliser, vous devez donc vous assurer qu’il est toujours valide. Par le passé, vous deviez effectuer cette opération manuellement, en comparant l’horodatage du condensé de requête à l’heure qu’il était.
SharePoint Framework (SPFx) simplifie le processus en vous proposant deux manières de vérifier la validité du jeton de condensé de votre requête.
Utilisation du SPHttpClient pour communiquer avec l’API REST de SharePoint
La méthode recommandée pour communiquer avec l’API REST de SharePoint consiste à utiliser l’API SPHttpClient incluse dans SPFx. Cette classe envoie des requêtes REST à l’API REST de SharePoint avec une logique appropriée qui simplifie votre code.
Par exemple, chaque fois que vous émettez une requête autres que GET avec l’API SPHttpClient, ce dernier vous obtiendra automatiquement un condensé de requête valide et l’ajoutera à la requête. Cela simplifie considérablement votre solution, puisque vous n’avez pas besoin de générer de code pour gérer les jetons de condensé de requête et garantir leur validité.
Si vous créez des personnalisations dans SharePoint Framework, vous devez toujours vous servir de l’API SPHttpClient pour communiquer avec l’API REST de SharePoint.
Parfois, vous ne pouvez pas utiliser l’API SPHttpClient. Par exemple, lorsque vous migrez une personnalisation existante vers SharePoint Framework et souhaitez conserver autant que possible le code d’origine, ou que vous créez une personnalisation à l’aide d’une bibliothèque comme Angular(JS), qui propose ses propres services pour les requêtes web.
Récupération d’un condensé de requête valide au moyen du service DigestCache
Si vous ne pouvez pas utiliser l’API SPHttpClient pour communiquer avec l’API REST de SharePoint, vous pouvez obtenir un jeton de condensé de requête valide à l’aide du service DigestCache fourni avec SharePoint Framework.
L’avantage du service DigestCache par rapport à une obtention manuelle du jeton de condensé de requête est que DigestCache vérifie automatiquement si le condensé de requête récupéré précédemment est toujours valide ou non. S’il a expiré, le service DigestCache demandera automatiquement un nouveau jeton de condensé de requête dans SharePoint et stockera celui-ci dans les demandes ultérieures. Le service DigestCache facilite votre code et rend votre solution plus robuste.
Pour utiliser le service DigestCache dans votre code
Importez les types DigestCache et IDigestCache à partir du package @microsoft/sp-http :
// ... import { IDigestCache, DigestCache } from '@microsoft/sp-http'; export default class HelloWorldWebPart extends BaseClientSideWebPart<IHelloWorldWebPartProps> { // ... }Chaque fois que vous aurez besoin d’un jeton de condensé de requête valide, récupérez une référence au service DigestCache et appelez sa méthode fetchDigest() :
// ... import { IDigestCache, DigestCache } from '@microsoft/sp-http'; export default class HelloWorldWebPart extends BaseClientSideWebPart<IHelloWorldWebPartProps> { protected onInit(): Promise<void> { return new Promise<void>((resolve: () => void, reject: (error: any) => void): void => { const digestCache: IDigestCache = this.context.serviceScope.consume(DigestCache.serviceKey); digestCache.fetchDigest(this.context.pageContext.web.serverRelativeUrl).then((digest: string): void => { // use the digest here resolve(); }); }); } // ... }