Обзор SharePoint Education. Часть 3
Третья часть обзора SharePoint Education, посвященная API.
Веб-сервис
SharePoint Education содержит замечательный сервис, доступный по адресу вида: http://speduapp/_vti_bin/edu/Data.svc.
Сервис DataProvider содержит два метода: ProcessGetRequest, ProcessPostRequest. Оба метода принимают единственный параметр типа Request.
Запросы могут быть трех видов: DataLayerRequest, ApplicationLayerRequest, BulkRequest:
Полная иерархия дочерних классов Request выглядит вот так:
- DataLayerRequest
- DataLayerReadRequest
- GetEntitiesByTypeRequest
- DataLayerReadRequest
- ApplicationLayerRequest
- ApplicationLayerReadRequest
- GetCurrentUserRequest
- IsAListRefreshingRequest
- ApplicationLayerWriteRequest
- AddRequest
- ChangeRequest
- CompleteCopyRequest
- CopyDocumentByUrlRequest
- CopyDocumentRequest
- CopyRequest
- PublishGradesRequest
- RemoveRequest
- ApplicationLayerReadRequest
- 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 все кроме пользователей описываются соответствующими типами содержимого:
Entity | EntityType |
---|---|
AcademicDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD7208554 |
Announcement | 0x0104008A4047FFBB374E0A8932030BE989F795 |
AssignedAssignment | 0x0108005CBC699A566E11E0A996B888DFD7208551 |
Assignment | 0x010063C2F478ACC511DFB869B5BFDFD720851252 |
AssignmentCategory | 0x010063C2F478ACC511DFB869B5BFDFD720851256 |
AssignmentGrade | 0x010063C2F478ACC511DFB869B5BFDFD72085125551 |
Community | 0x010063C2F478ACC511DFB869B5BFDFD7208511 |
CommunityEntity | 0x010063C2F478ACC511DFB869B5BFDFD7208512 |
CommunityMembership | 0x010027FC2137D8DE4B00A40E14346D070D5201 |
CopyWorkItem | 0x010063C2F478ACC511DFB869B5BFDFD72085120101 |
Course | 0x010063C2F478ACC511DFB869B5BFDFD720851101 |
CourseGrade | 0x010063C2F478ACC511DFB869B5BFDFD72085125552 |
Document | 0x0101008DA831F4ACC511DF8205CDBFDFD72085 |
DocumentFolder | 0x012000324696745BE411E0A68280E7DFD7208551 |
DocumentLookup | 0x01010A00256755BE5C9E11E09BD59556DFD7208552 |
EduDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD72085 |
Entity | 0x010063C2F478ACC511DFB869B5BFDFD72085 |
Event | 0x0102001E41EAB6184B11E0AE8631B7DFD7208553 |
EventSchedule | 0x0102001E41EAB6184B11E0AE8631B7DFD7208554 |
FeedbackDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD7208552 |
Grade | 0x010063C2F478ACC511DFB869B5BFDFD720851255 |
Lesson | 0x010063C2F478ACC511DFB869B5BFDFD720851251 |
Link | 0x01010A00256755BE5C9E11E09BD59556DFD7208551 |
Meeting | 0x0102001E41EAB6184B11E0AE8631B7DFD720855351 |
MeetingSchedule | 0x0102001E41EAB6184B11E0AE8631B7DFD720855451 |
Submission | 0x010063C2F478ACC511DFB869B5BFDFD720851254 |
User | User |
UserCommunityMembership | 0x01002DC5EE125BEC11E093DEDDF0DFD72086 |
WorkItem | 0x010063C2F478ACC511DFB869B5BFDFD720851201 |
При формировании запроса помимо обязательного параметра 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>();
}
Все остальные запросы строятся аналогично, принципиальных отличий нет. Пробуйте.