Introduction
Last week, I was working with SharePoint REST API. In some terms, I need to do some complicated query in a SP list. To do these queries, I prefer CAML. But to use CAML with SharePoint REST API, I have been banging my head against the wall for a couple of days as I was stacked with errors. At last, I got the solution that I wanted.
Using the Code
So what I missed is the first condition of using CAML with REST request. That is, it always has to be a POST
request. The request header is the same as the other normal post requests for SharePoint Rest API.
headers: {
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
'content-type': 'application/json;odata=verbose',
'accept': 'application/json;odata=verbose'
}
The REST endpoint for using CAML query is:
/_api/web/lists/GetByTitle('<List Name>')/GetItems
The complete code with the REST call is given below:
function restCallwithCaml(listName, caml) {
var siteUrl = _spPageContextInfo.siteAbsoluteUrl;
var data = { "query" : {"__metadata":
{ "type": "SP.CamlQuery" }, "ViewXml":caml}};
$.ajax({
url: siteUrl+"/_api/web/lists/GetByTitle
('"+ listName +"')/GetItems",
method: "POST",
data: data,
headers: {
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
'content-type': 'application/json;odata=verbose',
'accept': 'application/json;odata=verbose'
}
success: function (response) {
},
error: function (data) {
}
});
}
The CAML Query has to use in between this <View><Query>
…CAML Query…</Query></View>
tag. The query with the way to call the function is given below:
var caml = "<View><Query><Where><Eq>
<FieldRef Name='EndDate' /><Value Type='DateTime'>
<Today /></Value></Eq></Where></View></Query>";
restCallwithCaml(<listName>, caml);
Points of Interest
The CAML query can also be used in query string of the REST request. But it makes the URL unnecessarily complicated.