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

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

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

SharePoint Education API

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

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

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

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

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

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

  • ForceCacheExpireField
  • ForceSearchReadField
  • ForceSpReadField
  • ForceUdwReadField

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

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

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

// Запрос
var userRequest = new GetCurrentUserRequest
{
    // Контект запроса
    Context = new DataLayerRequestContext
    {
        Locale = CultureInfo.CurrentCulture.Name
    }
};
// Получение ответа. Ожидаем EntityResponse
var response = client.ProcessGetRequest(userRequest) as EntityResponse;
if (response != null)
{
    // Первая сущность коллекции в ответе сервера
    var entity = response.Entities[0];
    // Приводим к типу User
    var user = entity as User;
    if (user != null)
    {
        // TODO
    }
}

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

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

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

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

EntityEntityType
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:

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

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

using (var client = new DataProviderClient(binding))
{
    // Course ContentTypeId
    var courseEntityTypeId = "0x010063C2F478ACC511DFB869B5BFDFD720851101";
    // Parameter Context.Locale is required
    var courseRequestContext = new RequestContext
    {
        Locale = CultureInfo.CurrentCulture.Name
    };
    // Request
    var courseRequest = new GetEntitiesByTypeRequest
    {
        Context = courseRequestContext,
        EntityType = courseEntityTypeId,
        Query = new Query
        {
            Filter = new ConditionFilterExpression
            {
                Field = "Status",
                Operator = ConditionFilterOperator.EQ,
                Value = "Active"
            }
        }
    };
    // Response
    var courseResponse = client.ProcessGetRequest(courseRequest);
    // List of courses
    var courses = ((EntityResponse)courseResponse)
        .Entities
        .Cast<Course>();
}

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

Теги

Поделиться

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.