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)

Text: Query CAML

/_api/Web/Lists/getByTitle('nome lista')/GetItems(query=@v1)?@v1=<View>...</View>
Il codice JavaScript per la chiamata è questo

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/contextinfo

JavaScript: 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);
  });
}
che può essere usata nella forma

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 modo

JavaScript: 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);
  });
});
da un risultato JSON simile a questo

JSON: Result

[
  {
    "Id": 7,
    "ID": 7,
    "Title": "Power BI"
  }
]
Tags:
SharePoint Online75 C#235 CAML17 JavaScript184 JSON31 SharePoint 2013136
Potrebbe interessarti anche: