Получить все экземпляры повторяющегося события через CSOM

Мне нужно получить все экземпляры повторяющегося события календаря в Sharepoint 2013 онлайн через CSOM. Я читал, что это невозможно сделать, что мне нужно сделать это напрямую через REST API.

Мой вопрос:

1) Можно ли получить элементы из представления, а не из списка, потому что календарь поставляется с представлением по умолчанию, в котором я могу видеть все экземпляры повторяющегося события.

2) У меня есть пример извлечения данных через REST un C#, который работает нормально, но я не могу добавить к нему запрос Caml (на C#), вот мой нерабочий код:

HttpWebRequest itemRequest =
                (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "/_api/Web/lists/getbytitle('" + listName + "')/Items");
            itemRequest.Method = "POST";
            itemRequest.Accept = "application/atom+xml";
            itemRequest.ContentType = "application/atom+xml;type=entry";
            itemRequest.Headers.Add("Authorization", "Bearer " + accessToken);
            using (var writer = new StreamWriter(itemRequest.GetRequestStream()))
            {
                writer.Write(@"{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>little test</Value></Eq></Where></Query></View>' } }");
            }

            HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();

Я получаю 500 Внутренняя ошибка сервера

Есть предположения?? Спасибо


person Nicole    schedule 06.02.2015    source источник


Ответы (2)


Я бы рекомендовал использовать Fiddler для проверки запросов веб-службы REST SharePoint RESTfull.

В вашем случае конечная точка неверна. Поскольку вам необходимо запрашивать элементы списка с помощью запроса CAML, замените URL-адрес конечной точки следующим образом:

/_api/Web/lists/getbytitle('" + listName + "')/Items

к этому:

/_api/Web/lists/getbytitle('" + listName + "')/getitems

Во-вторых, заголовок application/atom+xml;type=entry HTTP Content-Type не поддерживается в запросах POST (см. список поддерживаемых типов MIME ниже). Итак, замените строки:

itemRequest.Accept = "application/atom+xml";
itemRequest.ContentType = "application/atom+xml;type=entry";

например, с этими:

itemRequest.Accept = "application/json";
itemRequest.ContentType = "application/json";

Вот и все.

Список поддерживаемых типов MIME

  • приложение/json;odata=минимальные метаданные;потоковая передача=true
  • приложение/json;odata=минимальные метаданные;потоковая передача=false
  • приложение/json;odata=минимальные метаданные
  • приложение / json; odata = полные метаданные; потоковая передача = true
  • приложение / json; odata = полные метаданные; потоковая передача = ложь
  • приложение / json; odata = полные метаданные
  • приложение/json;odata=нометаданные;потоковое=true
  • приложение / json; odata = нометаданные; потоковая передача = ложь
  • приложение / json; odata = нометаданные
  • приложение / json; потоковая передача = истина
  • приложение/json; потоковая передача = ложь
  • приложение / json; odata = подробный
  • приложение/json

Вы также можете использовать следующий класс для выполнения запросов REST:

public class SPRestExecutor
{

    public SPRestExecutor(Uri webUri,string accessToken)
    {
        WebUri = webUri;
        AccessToken = accessToken;
    }



    public JObject ExecuteJsonWithDigest(string endpointUrl, HttpMethod method, IDictionary<string, string> headers, JObject payload)
    {
        var formDigestValue = RequestFormDigest();
        var finalHeaders = new Dictionary<string, string>();
        if (headers != null)
        {
            foreach (var key in headers.Keys)
            {
                finalHeaders.Add(key, headers[key]);
            }
        }
        finalHeaders.Add("X-RequestDigest", formDigestValue);

        var result = ExecuteJson(endpointUrl, method, finalHeaders, payload);
        return result;
    }


    public JObject ExecuteJson(string endpointUrl, HttpMethod method, IDictionary<string, string> headers, JObject payload)
    {
        var request = (HttpWebRequest)WebRequest.Create(WebUri.ToString() + endpointUrl);
        request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AccessToken);
        request.Method = method.Method;
        request.Accept = "application/json;odata=verbose";
        request.ContentType = "application/json;odata=verbose";
        if (payload != null)
        {
            using (var writer = new StreamWriter(request.GetRequestStream()))
            {
                writer.Write(payload);
                writer.Flush();
            }
        }
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            using(var responseStream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(responseStream))
                {
                    var result = reader.ReadToEnd();
                    return JObject.Parse(result);
                }
            }
        }
    }


    /// <summary>
    /// Request Form Digest
    /// </summary>
    /// <returns></returns>
    protected string RequestFormDigest()
    {
        var result = ExecuteJson("/_api/contextinfo", HttpMethod.Post, null, null);
        return result["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
    }


    public string AccessToken { get; private set; }


    public Uri WebUri { get; private set; }
}

Суть

Применение

var client = new SPRestExecutor(webUri,accessToken);
var payload = JObject.Parse(@"{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query/></View>' } }");
var data = client.ExecuteJson("/_api/web/lists/getbytitle('Documents')/getitems", HttpMethod.Post, null, payload);
person Vadim Gremyachev    schedule 09.02.2015

Спасибо, Вадим Гремячев, ваш пост меня ввел в курс дела.

У меня было 3 проблемы, первая вызывала «Items» вместо «getItems», а вторая использовала «application/atom+xml;type=entry» в качестве ContentType (как и сказал Вадим).

Третья и последняя проблема заключалась в использовании простых кавычек по всему запросу. Внутри ViewXml я использовал экранированные двойные кавычки, чтобы их не путали с закрывающими элемент ViewXml.

Итак, рабочий код получился таким:

byte[] data = new ASCIIEncoding().GetBytes("{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, 'ViewXml': '<View><Query><Where><Eq><FieldRef Name=\"Title\"/><Value Type=\"Text\">little test</Value></Eq></Where></Query></View>' } }");

        HttpWebRequest itemRequest =
            (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "/_api/Web/lists/getbytitle('" + listName + "')/getitems");
        itemRequest.Method = "POST";
        itemRequest.ContentType = "application/json; odata=verbose";
        itemRequest.Accept = "application/atom+xml";
        itemRequest.Headers.Add("Authorization", "Bearer " + accessToken);

        itemRequest.ContentLength = data.Length;
        Stream myStream = itemRequest.GetRequestStream();
        myStream.Write(data, 0, data.Length);
        myStream.Close();         

        HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();
person Nicole    schedule 09.02.2015