Article
· 10 hr il y a 6m de lecture

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 

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) 

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"_filter

 La 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

Téléchargement de fichiers

suppression de fichiers

si vous cochez cette case 

Ajout de fichiers

Remerciements à @Dean White 
 

https://youtu.be/485dTXYp2BU

Mise à jour - ajout d'un lien YouTube et correction du lien d'échange ouvert;

Discussion (0)0
Connectez-vous ou inscrivez-vous pour continuer