Kategoriarkiv: CAML

Using CAML with SharePoint REST API

Do you prefer REST over CSOM as I do? I’ll skip the whys. Andrew Connell put it already in wrtiting so nicely. Well, if you do prefer REST, then you must have discovered some shortcomings of REST, or its incompleteness compared to CSOM. I think of:

  1. Inability to filter items based on multivalued taxonomy fields
  2. Inability to filter items based on user fields where user is added through a group, rather than directly, e.g. AssignedTo=[Me] combined with a SharePoint group.

In such situations I was forced to use CSOM. Until yesterday. Yesterday I learned that we can actually use CAML queries in REST requests.

 

This enables using REST in all situations. The REST API is still developed and many features are added. Maybe a particular operation that needs a CAML query today, can be supported in the core REST API and can be easily refactored then.

But until then, we can use CAML queries in REST requests. Here are the important things about it:

  • A REST request with a CAML query is always a POST request
  • A REST request with a CAML query has always to have X-RequestDigest http header (actually because it is a POST request)
  • A REST request with a CAML query should always have the attached CAML query in the request body (and not in a query string). We don’t want to mess with long urls, do we?
  • A REST request with a CAML query must have the http header “Content-Type: application/json;odata=verbose” unless you use xml in the request body.
Needed HTTP Headers in REST requests

HTTP headers you have to provide in REST requests with CAML queries

You can use jQuery or SP.RequestExecutor to make an ajax call. The REST endpoint is:

The request body (if you use json, and I bet, you do) is in this format:

Here is the boilerplate for a REST request with a CAML Query:

This function is just an example. It has no error handling, and it takes for granted that your list is in the root site for on your (sub-)domain (“/”). So take it as an example only.

Here is how the function can be invoked

How to provision a ContentEditorWebPart (CEWP) with predefined content to a page using a module

I did this a long time ago, then when I recently had to do it again, I couldn’t fid any Resources online describing how to do it. Simply adding text to the <Content> tags of the <AllUsersWebPart> declaration didn’t do it. The reason is simple I Think. The content in a CEWP is html, and you need encoded HTML tags for it to show. Otherwise the content will simply be ignored (This is my own theory at least. I haven’t investigated much).

So knowing that you can add any html content. Here is how you add an image for example:

The easiest way to get encoded HTML is to use an Encoder, like this one. Simply paste your html and press encode. Then paste the results inside the <Content> tag for the CEWP. My full code example can be found below. This is to be put inside the File element in a Module:

This works in SP2010 and 2013. Just change the assembly version to 14 or 15 depending on which you are using. I presume it works the same in 2007 also, but I haven’t tried.

Add Edit Control Block (ECB) menu to custom column

Sometimes, as a developer, I tend to overthink things, not looking for the most simple of solutions for a problem. This was the case when I wanted to change the url of the linkTitle field on a custom list I made, to the url stored in a custom column in the same list. My first solution included jQuery and SharePoint javascript to get all the listItem objects for the items shown in a view, and for each of those, run queries to retrieve the data I needed. This solutions was poor because it consumed unnecessary resources and was not completely stable.

After being almost completely finished with the solution I thought that what I really wanted to achieve was adding the Edit Control Block (Short: ECB, see picture below) menu to my custom column, which really has the same effect (for me) as changing the url for the linkTitle column. A couple of searches and I found that this is done by simply adding a property to my custom column in my content type and list definition:


(Picture of ECB menu in swedish)

So instead of using like 40 lines of javascript code I could use a very small line of CAML. Very neat indeed. =)

So if you want to create a custom column with the ECB menu, you can define it like this (My example is for a hyperlink column):