Solitamente con le
REST API di
SharePoint non si usano le query
CAML (vedi
Chiamare una Rest API di SharePoint Online da SPFx) ma può comunque tornare utile in specifici casi.
Le chiamate
REST con query
CAML sono permesse solo in
POST passando in
QueryString l'espressione
CAML (vedi parametro @v1)
/_api/Web/Lists/getByTitle('nome lista')/GetItems(query=@v1)?@v1=<View>...</View>
Il codice
JavaScript per la chiamata è questo
var camlQuery = "<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>Power BI</Value></Eq></Where></Query></View>";
var url = "/_api/Web/Lists/getByTitle('Test Configurable View')/GetItems(query=@v1)?$select=Id,Title&@v1="+ JSON.stringify({ViewXml: camlQuery});
var options = {
method: 'POST',
headers: { 'Accept': 'application/json;odata=nometadata'}
};
var response = fetch(url, options)
.then(function(response) {
console.log('response', response);
return response.json();
})
.then(function(data) {
console.log('json', data);
});
});
Viene usata la
Fetch API per le chiamate REST.
se però si prova ad eseguire questo
JavaScript si otterrà l'errore:
The security validation for this page is invalid and might be corrupted. Please use your web browser's Back button to try your operation again.
in quanto la query richiede il passaggio, nell'header della chiamata, del parametro
X-RequestDigest contenere il valore del
digest.
Ricavare il Digest
Per ottenere il valore del
digest si può usare l'API alla url
/_api/contextinfofunction getDigest(callback) {
var urlContext = "/_api/contextinfo";
var options = {
method: 'POST',
cache: 'no-cache',
headers: { 'Accept': 'application/json;odata=verbose' }
};
var response = fetch(urlContext, options)
.then(function(response) { return response.json() })
.then(function(data) {
var digest = data.d.GetContextWebInformation.FormDigestValue;
console.log('digest', digest);
callback(digest);
});
}
che può essere usata nella forma
getDigest(function(digest) { ... codice che richiede il digest ...});
Query CAML
A questo punto chiamata REST con la query
CAML può essere fatta in questo modo
getDigest(function(digest) {
var camlQuery = "<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>Power BI</Value></Eq></Where></Query></View>";
// il parametro $select può essere implementato anche tramite CAML
var url = "/_api/Web/Lists/getByTitle('Test Configurable View')/GetItems(query=@v1)?$select=Id,Title&@v1="+ JSON.stringify({ViewXml: camlQuery});
var options = {
method: 'POST',
cache: 'no-cache',
headers: {
'Accept': 'application/json;odata=nometadata',
'X-RequestDigest': digest
}
};
var response = fetch(url, options)
.then(function(response) {
console.log('response', response);
return response.json();
})
.then(function(data) {
console.log('json', data);
});
});
da un risultato
JSON simile a questo
[
{
"Id": 7,
"ID": 7,
"Title": "Power BI"
}
]