Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Effettuare una richiesta alle REST API di SharePoint 2013 tramite le classi del .NET Framework

Ormai abbiamo parlato tanto delle REST API di SharePoint 2013 e sicuramente ne parleremo ancora.
Una delle cose di cui abbiamo parlato è il modello aperto che hanno queste API, cioè la possibilità di essere richiamate da applicazioni che girano all'esterno del contesto di SharePoint tramite delle semplici richieste HTTP.
Ovviamente la richiesta HTTP prima deve cercare di autenticarsi, ma una volta passato questo "ostacolo" il gioco è fatto.
Possiamo giocare con i dati presenti all'interno dei nostri siti e delle nostre liste SharePoint o sfruttarne i suoi servizi più ricchi (ricerca, user profile, ecc..).

In questo post vedremo quali sono i passi base per richiamare queste API da un'applicazione scritta utilizzando il .NET Framework (nel mio caso una semplice console application). 
Non importa con che versione del framework state lavorando, le classi utilizzate in questo esempio (o per lo meno, le cassi più "importanti") sono presenti in tutte le versioni attualmente sul mercato.

Ecco quindi il codice necessario per recuperare, ad esempio, tutte le liste presenti in un particolare sito SharePoint.

//url
string url = "http://sp2013/_api/web/lists?$select=Title";

//credenziali
CredentialCache credentials = new CredentialCache();
credentials.Add(new Uri(url), "NTLM", CredentialCache.DefaultNetworkCredentials);

//richiesta HTTP
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Credentials = credentials;
request.Method = "GET";
request.Accept = "application/atom+xml;odata=verbose";
request.ContentLength = 0;

//lettura risposta HTTP
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string results = GetHTTPResponse(response);
XmlDocument doc = new XmlDocument();
doc.LoadXml(results);
XmlNamespaceManager namespaces = new XmlNamespaceManager(new NameTable());
namespaces.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices");
var lists = doc.SelectNodes("//d:Title", namespaces);
foreach (XmlNode list in lists)
    Console.WriteLine(list.InnerText);

Console.Read();

Come vi dicevo, questo codice può essere eseguito in qualsiasi applicazione .NET interna o esterna al contesto di SharePoint. L'unica cosa cui dobbiamo stare attenti è l'autenticazione, ma ne parleremo dopo. 

Avrete sicuramente capito che è bastato utilizzare le classi di base del framework per costruire una nuova richiesta HTTP, passare i parametri utili a fare in modo che questa richiesta ritornasse la risorsa che ci interessava e, infine, leggerne la risposta.
La risposta l’ho richiesta in Atom (XML), quindi ho dovuto poi utilizzare le classi del namespace System.Xml (in particolare la classe XmlDocument) per leggere il suo contenuto e recuperare le informazioni che mi interessavano (nel mio caso, il titolo delle varie liste).
Il metodo GetHTTPResponse l’ho lasciato a parte, perché è un metodo generico che riutilizzo da tante altri parti.
Eccolo per completezza:

private static String GetHTTPResponse(HttpWebResponse response)
{
    var stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    var results = reader.ReadToEnd();

    reader.Close();
    stream.Close();

    return results;
}

Le cose su cui dobbiamo porre la nostra attenzione sono sicuramente la preparazione della richiesta, l'autenticazione e la lettura delle risposta.

La richiesta (l'oggetto di tipo HttpWebRequest) ha bisogno delle stesse informazioni di cui abbiamo parlato quando abbiamo visto come utilizzare le REST API di SharePoint 2013 tramite JQuery, valorizzando le relative proprietà Credentials, Method, Accept e ContentLength.
L'ultima in particolare non è tanto importante quando facciamo delle richieste in GET, ma lo è quando invece facciamo delle richieste in POST. Tenetelo a mente.

L’autenticazione viene trattata passando le credenziali correnti alla classe HttpWebRequest. Del resto (cioè della vera e propria autenticazione tramite NTLM) se ne occupa il .NET Framework. Ovviamente, l'utente corrente deve avere i permessi per accedere al sito SharePoint. Altrimenti la chiamata non andrà a buon fine.
Nel caso in cui invece non avessimo la possibilità di utilizzare le classi del .NET Framework e dovessimo quindi fare questa richiesta HTTP tramite un'altra piattaforma o un altro linguaggio, avremmo dovuto preparare a mano la richiesta HTTP.

La lettura della risposta, come vi dicevo, è stata invece fatta andando a parsare l’XML di ritorno. A tal proposito, la cosa da tenere sott'occhio riguarda i namespace che Microsoft utilizza per definire la struttura di ogni risposta. Questi namespace vanno aggiunti durante la fase di lettura dell'XML risultante, onde evitare eccezioni. 
Nel caso in cui scegliete di farvi ritornare i dati in formato JSON (scelta in generale più che saggia, visto che vi diminuisce il peso della risposta), dovete però trovare un modo per parsarlo. Vedremo nei prossimi post cosa possiamo fare a riguardo.
Certo, con Javascript non avete questo problema di parsing, in quanto il risultato che torna da una richiesta alle API di SharePoint 2013 (se utilizzate JSON come tipo di dato) viene convertito in automatico in veri e propri oggetti pronti all'uso.

Nei prossimi post vedremo anche come poter fare una chiamata in POST e creare, ad esempio, una nuova cartella in una document library.
blog comments powered by Disqus