Обзор SharePoint Education. Часть 3

Третья часть обзора SharePoint Education, посвященная API.

SharePoint Education API

Веб-сервис

SharePoint Education содержит замечательный сервис, доступный по адресу вида: http://speduapp/_vti_bin/edu/Data.svc.

Сервис DataProvider содержит два метода: ProcessGetRequest, ProcessPostRequest. Оба метода принимают единственный параметр типа Request.

Запросы могут быть трех видов: DataLayerRequest, ApplicationLayerRequest, BulkRequest:

SharePoint Education Request

Полная иерархия дочерних классов Request выглядит вот так:

  • DataLayerRequest
    • DataLayerReadRequest
      • GetEntitiesByTypeRequest
  • ApplicationLayerRequest
    • ApplicationLayerReadRequest
      • GetCurrentUserRequest
      • IsAListRefreshingRequest
    • ApplicationLayerWriteRequest
      • AddRequest
      • ChangeRequest
      • CompleteCopyRequest
      • CopyDocumentByUrlRequest
      • CopyDocumentRequest
      • CopyRequest
      • PublishGradesRequest
      • RemoveRequest
  • BulkRequest

Все варианты я описывать не буду, покажу пару примеров использования сервиса для работы с SharePoint Education.

Базовый класс Request содержит обязательное свойство Context. Для начала про него необходимо знать только то, что указание локали обязательно:

  1. // Контекст запроса
  2. var requestContext = new DataLayerRequestContext
  3. {
  4.     Locale = CultureInfo.CurrentCulture.Name
  5. };

При использовании DataLayerRequest необходимо использовать контекст типа DataLayerRequestContext (наследник RequestContext). В этом случае в контексте можно указывать дополнительные параметры:

  • ForceCacheExpireField
  • ForceSearchReadField
  • ForceSpReadField
  • ForceUdwReadField

Если первые три интуитивно понятны, то последний для меня остается загадкой.

Получение текущего пользователя

Самый простой сценарий: получение информации о текущем пользователе:

  1. // Запрос
  2. var userRequest = new GetCurrentUserRequest
  3. {
  4.     // Контект запроса
  5.     Context = new DataLayerRequestContext
  6.     {
  7.         Locale = CultureInfo.CurrentCulture.Name
  8.     }
  9. };
  10. // Получение ответа. Ожидаем EntityResponse
  11. var response = client.ProcessGetRequest(userRequest) as EntityResponse;
  12. if (response != null)
  13. {
  14.     // Первая сущность коллекции в ответе сервера
  15.     var entity = response.Entities[0];
  16.     // Приводим к типу User
  17.     var user = entity as User;
  18.     if (user != null)
  19.     {
  20.         // TODO
  21.     }
  22. }

Еще диаграмма для понимания связи и содержания классов Entity и User.

Второй пример посложней

Получение сущностей из SharePoint Education

Теперь получим коллекцию курсов с помощью запроса типа GetEntitiesByTypeRequest. Типы сущностей (Entity) в SharePoint Education все кроме пользователей описываются соответствующими типами содержимого:

Entity EntityType
AcademicDocument0x0101008DA831F4ACC511DF8205CDBFDFD7208554
Announcement0x0104008A4047FFBB374E0A8932030BE989F795
AssignedAssignment0x0108005CBC699A566E11E0A996B888DFD7208551
Assignment0x010063C2F478ACC511DFB869B5BFDFD720851252
AssignmentCategory0x010063C2F478ACC511DFB869B5BFDFD720851256
AssignmentGrade0x010063C2F478ACC511DFB869B5BFDFD72085125551
Community0x010063C2F478ACC511DFB869B5BFDFD7208511
CommunityEntity0x010063C2F478ACC511DFB869B5BFDFD7208512
CommunityMembership0x010027FC2137D8DE4B00A40E14346D070D5201
CopyWorkItem0x010063C2F478ACC511DFB869B5BFDFD72085120101
Course0x010063C2F478ACC511DFB869B5BFDFD720851101
CourseGrade0x010063C2F478ACC511DFB869B5BFDFD72085125552
Document0x0101008DA831F4ACC511DF8205CDBFDFD72085
DocumentFolder0x012000324696745BE411E0A68280E7DFD7208551
DocumentLookup0x01010A00256755BE5C9E11E09BD59556DFD7208552
EduDocument0x0101008DA831F4ACC511DF8205CDBFDFD72085
Entity0x010063C2F478ACC511DFB869B5BFDFD72085
Event0x0102001E41EAB6184B11E0AE8631B7DFD7208553
EventSchedule0x0102001E41EAB6184B11E0AE8631B7DFD7208554
FeedbackDocument0x0101008DA831F4ACC511DF8205CDBFDFD7208552
Grade0x010063C2F478ACC511DFB869B5BFDFD720851255
Lesson0x010063C2F478ACC511DFB869B5BFDFD720851251
Link0x01010A00256755BE5C9E11E09BD59556DFD7208551
Meeting0x0102001E41EAB6184B11E0AE8631B7DFD720855351
MeetingSchedule0x0102001E41EAB6184B11E0AE8631B7DFD720855451
Submission0x010063C2F478ACC511DFB869B5BFDFD720851254
UserUser
UserCommunityMembership0x01002DC5EE125BEC11E093DEDDF0DFD72086
WorkItem0x010063C2F478ACC511DFB869B5BFDFD720851201

При формировании запроса помимо обязательного параметра EntityType можно также указать свойство Query, которое используется для фильтрации и сортировки запрашиваемых данных.

С сортировкой всё просто: указываем поля и направление сортировки. Что касается фильтрации, то CAML-запросы в SharePoint Education инкапсулированы в FilterExpression:

На мой взгляд замечательная реализация.

В примере я создал запрос для выбора всех активных курсов:

  1. using (var client = new DataProviderClient(binding))
  2. {
  3.     // Course ContentTypeId
  4.     var courseEntityTypeId = "0x010063C2F478ACC511DFB869B5BFDFD720851101";
  5.     // Parameter Context.Locale is required
  6.     var courseRequestContext = new RequestContext
  7.     {
  8.         Locale = CultureInfo.CurrentCulture.Name
  9.     };
  10.     // Request
  11.     var courseRequest = new GetEntitiesByTypeRequest
  12.     {
  13.         Context = courseRequestContext,
  14.         EntityType = courseEntityTypeId,
  15.         Query = new Query
  16.         {
  17.             Filter = new ConditionFilterExpression
  18.             {
  19.                 Field = "Status",
  20.                 Operator = ConditionFilterOperator.EQ,
  21.                 Value = "Active"
  22.             }
  23.         }
  24.     };
  25.     // Response
  26.     var courseResponse = client.ProcessGetRequest(courseRequest);
  27.     // List of courses
  28.     var courses = ((EntityResponse)courseResponse)
  29.         .Entities
  30.         .Cast<Course>();
  31. }

Все остальные запросы строятся аналогично, принципиальных отличий нет. Пробуйте.


Поделиться

Коментарии