Query CAML con le REST API di SharePoint
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)
Il codice JavaScript per la chiamata è questo
che può essere usata nella forma
da un risultato JSON simile a questo
Le chiamate REST con query CAML sono permesse solo in POST passando in QueryString l'espressione CAML (vedi parametro @v1)
Text: Query CAML
/_api/Web/Lists/getByTitle('nome lista')/GetItems(query=@v1)?@v1=<View>...</View>
JavaScript: REST Caml
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/contextinfoJavaScript: getDigest
function 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);
});
}
JavaScript
getDigest(function(digest) { ... codice che richiede il digest ...});
Query CAML
A questo punto chiamata REST con la query CAML può essere fatta in questo modoJavaScript: Caml query
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);
});
});
JSON: Result
[
{
"Id": 7,
"ID": 7,
"Title": "Power BI"
}
]