SharePoint/ API de SPO avec Intersystems
Dans le cadre du concours Open Exchange, l'hôpital Salford Royal (Dean White et Mark O'Reilly) a développé une API REST pour SharePoint, un modèle qui fonctionne mais qui peut aussi servir de point de départ à vos propres applications REST
Conditions préalables
Lorsque vous utilisez la v1 du service REST de l'API de Sharepoint, vous avez besoin d'un identifiant locataire, d'un identifiant client, d'un code secret client et d'un nom de locataire
Configuration
Configuration d'un serveur OAuth
Le code au milieu est l'identifiant locataire
Créez un nom de config client comme vous le souhaitez
.png)
Configurer votre client oauth en remplaçant l'adresse IP de votre serveur par l'adresse IP du serveur sur lequel vous vous trouvez (pas l'adresse VIP - si vous ne faites pas partie d'un VIP, l'adresse locale peut fonctionner)
.png)
Ajouter les informations d'identification client
modifiez les paramètres sur SharepointRESTConnector comme HTTPSERVER,SHAREPOINT-SITENAME- SHAREPOINT FILEPATH- SSL (vierge jusqu'à la v. 1.3) les paramètres remplacent le nom locataire et l'identifiant locataire.
Code
SharePointOnlineRESTOperation
OAuth Scope n'est pas utilisateur dans cet exemple mais est laissé ici comme modèle si vous en avez besoin pour d'autres implémentations rest
Il utilise et s'appuie sur rest par défaut Set tSC=..AddAccessToken(.tHttpRequest) qui gère le jeton et transmet toutes les propriétés supplémentaires requises pour l'API. Pour l'API SharePoint, une ressource est nécessaire et cette dernière est ajoutée dans les paramètres dans les notes de commentaires
/// Pour SPO, les paramètres doivent être {"resource":"00000003-0000-0ff1-ce00-000000000000/{TennantName}.sharepoint.com@{TennantID}"} <p>/// 00000003-0000-0ff1-ce00-000000000000 est l'identifiant ResourceID attribué à SPO par Microsoft et ne doit pas être modifié <p>/// {TennantName} doit être modifié pour être identique à celui du serveur HTTP, par exemple intersystems.sharepoint.com <p>/// {TennantID} est l'identifiant de votre nom de serveur Obtention d'une liste de fichiers
Appelle la liste des fichiers dans le répertoire dont vous disposez. Cette fonction peut indiquer le temps écoulé depuis le dernier téléchargement ou la durée totale des fichiers Elle interroge l'en-tête
Elle appelle GetFolderByServerRealativeURL
Set..Adapter.URL="/sites/"_$$$URLENCODE(..SharepointSitename)_"/_api/web/GetFolderByServerRelativeUrl('"_$$$URLENCODE(..SharepointFilePath)_"')/Files"_filter Set..Adapter.URL="/sites/"_$$$URLENCODE(..SharepointSitename)_"/_api/web/GetFolderByServerRelativeUrl('"_$$$URLENCODE(..SharepointFilePath)_"')/Files"_filterLa réponse est lue par le processeur.
Il envoie des messages http comme le ferait POSTMAN
Une méthode de réponse Constuct a été tirée de l'opération générique écrite par intersystems pour renvoyer des réponses http
Suppression du fichier
Appelle une demande d'envoi de suppression à getfolderbyserverrelativeurl/files getfolderbyserverrelativeurl/files
lignes clés ci-dessous
Set..Adapter.URL="/sites/"_$$$URLENCODE(..SharepointSitename)_"/_api/web/GetFolderByServerRelativeUrl('"_$$$URLENCODE(..SharepointFilePath)_"')/Files('"_$$$URLENCODE(pRequest.FileName)_"')"Set tSC=..AddAccessToken(.tHttpRequest)
s tSC = ..SendRequest(.tHttpResponse,send,tHttpRequest, .pResponse)
Quit..constructResponse(.tHttpResponse,.pResponse)Téléchargement du fichier
Si c'est un Ens.StringContainer (vous pourriez en faire un message sur mesure qui l'étendrait, comme Messages.DownloadSharpointFile), il lit le nom et l'envoie dans l'url de l'api. Il lit le paquet de réponses et ajoute le flux binaire à un steamcontainer. Comme toujours, il faut créer le flux et l'empaqueter dans le streamcontainer.
Code clé ci-dessous (quelques s ont été modifiés pour être affichés ici)
set binaryStream =##Class(%Stream.FileBinary).%New()
Set tSC=..AddAccessToken(.tHttpRequest)
Set..Adapter.URL="/sites/"_$$$URLENCODE(..SharepointSitename)_"/_api/web/GetFolderByServerRelativeUrl('"_$$$URLENCODE(..SharepointFilePath)_"')/Files('"_$$$URLENCODE(pRequest.StringValue)_"')/OpenBinaryStream()"Set tHttpResponse = ##class(%Net.HttpResponse).%New()
set send="GET"set tSC = ..SendRequest(.tHttpResponse,send,tHttpRequest, .pResponse)
set pDownloadResponse =##Class(Ens.StreamContainer).%New(binaryStream)
set pDownloadResponse.OriginalFilename=pRequest.StringValue
Ajout du fichier
GetFolderByServerRelativeUrl/filepath/Files/add(url=filename,overwrite?)
Lignes clées
Set..Adapter.URL="/sites/"_$$$URLENCODE(..SharepointSitename)_"/_api/web/GetFolderByServerRelativeUrl('"_$$$URLENCODE(..SharepointFilePath)_"')/Files/add(url='"_fn_"',overwrite="_$$$URLENCODE(..OverwriteExistingFile)_")"Set tSC=..AddAccessToken(.tHttpRequest)
s tHttpRequest.EntityBody=##Class(%Stream.FileBinary).%New()
s sc=tHttpRequest.EntityBody.CopyFromAndSave(pFileToUpload.Stream)
Set tHttpResponse = ##class(%Net.HttpResponse).%New()
S send="POST"s tSC = ..SendRequest(.tHttpResponse,send,tHttpRequest, .pResponse)Envoi de la demande
Cette fonction permet d'envoyer toute requête qui attend une réponse http.
Assure le transfert des réponses et l'envoi de ENSLIB.HTTP.GenericMessage. De nombreux en-têtes sont renvoyés et une case à cocher permet de simplifier la réponse pour qu'elle ne contienne qu'un code d'erreur et des données.
Construction de la réponse
Utilisé ailleurs dans l'EIT et non dans le code original de cette méthode
AddAccessToken
C'était le véritable apprentissage. il s'agit d'un code par défaut pour utiliser les paramètres OAuth Intersystems et non pas un code en dur à chaque fois que nous avons besoin de l'utiliser.
Tout est construit autour de trois appels
est autorisé et
Set isAuthorised = ##class(%SYS.OAuth2.AccessToken).IsAuthorized(..OAuthClientApplicationName,sessionId,..OAuthScope,.accessToken,,.responseProperties,.error)Obtenez un jeton d'accès
Set tSC = ##class(%SYS.OAuth2.Authorization).GetAccessTokenClient(..OAuthClientApplicationName,..OAuthScope,.properties,.error,.sessionId)et un jeton d'ajout qui l'ajoute à l'en-tête - malheureusement, il ne semble pas qu'il puisse l'ajouter au corps du message si l'identifiant est requis par d'autres API
;La valeur par défaut de sslConfiguration provient de l'instance OAuth2.Client. Set tSC = ##class(%SYS.OAuth2.AccessToken).AddAccessToken(pHttpRequest,sendType,,..OAuthClientApplicationName,sessionId)En outre, l'API Sharepoint nécessite une ressource. Nous avons généralisé l'utilisation de JSON, et si vous avez besoin d'autres paramètres, nous avons pensé à les ajouter en JSON afin de pouvoir réutiliser le modèle à l'avenir.
il l'ajoute à l'objet chaîne de caractères utilisé par les propriétés. il s'agit d'une chaîne de caractères sérialisée sous forme de tableau ou similaire
s paramsarr = [].%FromJSON(..Params)
s iterator = paramsarr.%GetIterator()
s properties=""While iterator.%GetNext(.key,.value)
{
s properties(key)=value
}Exemples de traces
Obtention de la liste des fichiers
.png)
Téléchargement de fichiers
.png)
suppression de fichiers
si vous cochez cette case
.png)
Ajout de fichiers
.png)
Remerciements à @Dean White
https://youtu.be/485dTXYp2BUMise à jour - ajout d'un lien YouTube et correction du lien d'échange ouvert;
.png)