sharepoint
Услуги REST
Поиск…
замечания
URL-адрес конечной точки службы REST
API доступа клиента REST был впервые представлен в SharePoint 2010, но был значительно расширен в SharePoint 2013. API REST в SharePoint 2010 доступен через веб-службу /_vti_bin/ListData.svc
URL-адресу /_vti_bin/ListData.svc
. В SharePoint 2013 были введены URL-адреса /_api/lists/
and /_api/web
endpoint, которые ведут себя несколько иначе.
Вышеуказанным URL-адресам конечных точек должен предшествовать http://server/site
где server
представляет имя сервера, а site
представляет собой имя или путь к определенному сайту.
Пример URL для ... | SharePoint 2010 | SharePoint 2013 |
---|---|---|
Получение списка: | /_vti_bin/ListData.svc/ListName | /_api/lists('ListGuid') |
Получение элемента: | /_vti_bin/ListData.svc/ListName(1) | /_api/lists('ListGuid')/items(1) |
Получение веб-страницы: | (без эквивалента) | /_api/web |
Несмотря на различия в доступе к спискам и элементам списка, работа с этими результатами очень схожа в обеих версиях.
Обратите внимание, что служба ListData.svc
по-прежнему доступна в SharePoint 2013 для обратной совместимости.
Отправка запросов REST
Запрос REST может быть отправлен через собственный XMLHttpRequest JavaScript или через конструкцию оболочки jQuery AJAX.
Синтаксис XMLHttpRequest
var xhr = new XMLHttpRequest();
xhr.open(verb, url, true);
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(data);
Синтаксис JQuery AJAX
$.ajax({
method: verb,
url: url,
headers: { "Content-Type":"application/json" },
data: data
});
Подробнее о отправке запросов через AJAX см. В документации JavaScript AJAX .
Работа со списками
Получение элементов списка
В этом примере показано, как извлекать все элементы списка и проходить через них. Вы можете использовать top
параметр для запроса определенного количества результатов. Вы также можете использовать параметр select
для выбора определенных полей ( $select=id, Title, uri
).
JavaScript
function GetListItems(){
$.ajax({
url: "../_api/web/lists/getbytitle('List Title')/items?$top=50"
contentType: "application/json;odata=verbose",
method: "GET",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
$.each(data.d.results, function(index,item){
//use item to access the individual list item
console.log(item.Id);
});
},
error: function(error){
console.log(error);
}
});
}
Получение отдельного элемента списка
JavaScript
function GetListItem(){
$.ajax({
url: "../_api/web/lists/getbytitle('List Title')/items(1)",
contentType: "application/json;odata=verbose",
method: "GET",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
console.log(data.d.Id);
},
error: function(error){
console.log(error);
}
});
}
Получить элементы списка с колонками поиска
Иногда у вас может быть структура списка, которая выглядит так:
Список листинга животных
название | Тип | Описание |
---|---|---|
заглавие | Строка (текст) | Название животного |
Возраст | Число | Сколько лет животное |
Значение | валюта | Значение животного |
Тип | Поиск (таблица типов животных) | Поле поиска (дает раскрывающийся список вариантов из таблицы типов животных) |
Таблица видов животных
название | Тип | Описание |
---|---|---|
заглавие | Строка (текст) | Название вида / вида животных (например, свиньи) |
NumLegs | Число | Количество ног на животном |
Вероятно, это не самый серьезный пример, но проблема здесь остается в силе. Когда вы используете обычный запрос для извлечения значений из списка SharePoint, для Type
животного вы получите только поле TypeId
в ответе JSON. Чтобы развернуть эти элементы только в одном вызове AJAX, в параметрах URL требуется дополнительная разметка.
Этот пример применим не только к столбцам поиска. Когда вы используете столбцы « People/Groups
, они, по сути, просто ищут, поэтому вы можете легко переносить такие предметы, как Title
, EMail
и другие.
Пример кода
Важное примечание . Когда вы определяете поля, которые хотите вернуть из столбцов поиска, вы должны указать имя поля с именем поля поиска в исходной таблице. Например, если вы хотите вернуть атрибут NumLegs
из столбца поиска, вы должны ввести Type/NumLegs
.
JavaScript
// webUrl: The url of the site (ex. https://www.contoso.com/sites/animals)
// listTitle: The name of the list you want to query
// selectFields: the specific fields you want to get back
// expandFields: the name of the fields that need to be pulled from lookup tables
// callback: the name of the callback function on success
function getItems(webUrl,listTitle,selectFields, expandFields, callback){
var endpointUrl = webUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/items";
endpointUrl+= '?$select=' + selectFields.join(",");
endpointUrl+= '&$expand=' + expandFields.join(",");
return executeRequest(endpointUrl,'GET', callback);
}
function executeRequest(url,method,callback,headers,payload)
{
if (typeof headers == 'undefined'){
headers = {};
}
headers["Accept"] = "application/json;odata=verbose";
if(method == "POST") {
headers["X-RequestDigest"] = $("#__REQUESTDIGEST").val();
}
var ajaxOptions =
{
url: url,
type: method,
contentType: "application/json;odata=verbose",
headers: headers,
success: function (data) { callback(data) }
};
if(method == "POST") {
ajaxOptions.data = JSON.stringify(payload);
}
return $.ajax(ajaxOptions);
}
// Setup the ajax request by setting all of the arguments to the getItems function
function getAnimals() {
var url = "https://www.contoso.com/sites/animals";
var listTitle = "AnimalListing";
var selectFields = [
"Title",
"Age",
"Value",
"Type/Title",
"Type/NumLegs"
];
var expandFields = [
"Type/Title",
"Type/NumLegs"
];
getItems(url, listTitle, selectFields, expandFields, processAnimals);
}
// Callback function
// data: returns the data given by SharePoint
function processAnimals(data) {
console.log(data);
// Process data here
}
// Start the entire process
getAnimals();
Добавление выбора в многозначное поле поиска
В этом примере предполагается, что столбец поиска называется MultiLookupColumnName
и что вы хотите настроить поле поиска нескольких поисковых MultiLookupColumnName
на элементы с идентификаторами 1 и 2.
Использование jQuery AJAX
var listName = "YourListName";
var lookupList = "LookupListName";
var idOfItemToUpdate = 1;
var url = "/server/site/_vti_bin/ListData.svc/"+listName+"("+idOfItemToUpdate+")";
var data = JSON.stringify({
MultiLookupColumnName:[
{__metadata:{uri:"http://yoursiteurl/_vti_bin/ListData.svc/"+lookupList+"(1)"}},
{__metadata:{uri:"http://yoursiteurl/_vti_bin/ListData.svc/"+lookupList+"(2)"}}
]
});
$.ajax({
method: 'POST',
url: url,
contentType: 'application/json',
headers: {
"X-HTTP-Method" : "MERGE",
"If-Match" : "*"
},
data: data
});
var listGuid = "id-of-list-to-update"; // use list GUID here
var lookupGuid = "id-of-lookup-list"; // use lookup list GUID here
var idOfItemToUpdate = 1;
var url = "/server/site/_api/lists('"+ listGuid + "')/items("+ idOfItemToUpdate + ")";
var data = JSON.stringify({
MultiLookupColumnName:[
{__metadata:{uri:"http://yoursiteurl/_api/lists('" + lookupGuid + "')/items(1)"}},
{__metadata:{uri:"http://yoursiteurl/_api/lists('" + lookupGuid + "')/items(2)"}}
]
});
$.ajax({
method: 'POST',
url: url,
contentType: 'application/json',
headers: {
"X-HTTP-Method" : "MERGE",
"If-Match" : "*"
},
data: data
});
Использование XMLHttpRequest
var listName = "YourListName";
var lookupList = "LookupListName";
var idOfItemToUpdate = 1;
var url = "/server/site/_vti_bin/ListData.svc/YourListName("+idOfItemToUpdate+")";
var data = JSON.stringify({
MultiLookupColumnName:[
{__metadata:{uri:"http://yoursiteurl/_vti_bin/ListData.svc/"+lookupList+"(1)"}},
{__metadata:{uri:"http://yoursiteurl/_vti_bin/ListData.svc/"+lookupList+"(2)"}}
]
});
var xhr = new XMLHttpRequest();
xhr.open("POST",url,true);
xhr.setRequestHeader("X-HTTP-Method", "MERGE");
xhr.setRequestHeader("If-Match", "*");
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(data);
var listGuid = "id-of-list-to-update";
var lookupGuid = "id-of-lookup-list";
var idOfItemToUpdate = 1;
var url = "/server/site/_api/lists('"+ listGuid + "')/items("+ idOfItemToUpdate + ")";
var data = JSON.stringify({
MultiLookupColumnName:[
{__metadata:{uri:"http://yoursiteurl/_api/lists('" + lookupGuid + "')/items(1)"}},
{__metadata:{uri:"http://yoursiteurl/_api/lists('" + lookupGuid + "')/items(2)"}}
]
});
var xhr = new XMLHttpRequest();
xhr.open("POST",url,true);
xhr.setRequestHeader("X-HTTP-Method", "MERGE");
xhr.setRequestHeader("If-Match", "*");
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(data);
Элементы списка подкачки, возвращаемые из запроса
Чтобы смоделировать пейджинг с помощью REST, вы можете сделать следующее:
Используйте параметр
$skip=n
чтобы пропустить первыеn
записей в соответствии с параметром$orderby
Используйте параметр
$top=n
чтобы вернуть верхниеn
записей в соответствии с параметрами$orderby
и$skip
.
var endpointUrl = "/_api/lists('guid')/items"; // SP2010: "/_vti_bin/ListData.svc/ListName";
$.getJSON(
endpointUrl + "?$orderby=Id&$top=1000",
function(data){
processData(data); // you can do something with the results here
var count = data.d.results.length;
getNextBatch(count, processData, onComplete); // fetch next page
}
);
function getNextBatch(totalSoFar, processResults, onCompleteCallback){
$.getJSON(
endpointUrl + "?$orderby=Id&$skip="+totalSoFar+"&$top=1000",
function(data){
var count = data.d.results.length;
if(count > 0){
processResults(data); // do something with results
getNextBatch(totalSoFar+count, callback); // fetch next page
}else{
onCompleteCallback();
}
}
);
}
Получить идентификатор вновь созданного элемента в списке SharePoint
В этом примере показано, как получить идентификатор вновь созданного элемента с помощью API REST SharePoint.
Замечания :
listName - эта переменная содержит имя вашего списка.
newItemBody - это будет ваш орган запроса для добавления нового элемента в список.
например var newItemBody = {__metadata: {'type': 'SP.Data.MyListNameItem'}, Title: 'Some title value'};
function CreateListItemWithDetails(listName, newItemBody) {
var item = newItemBody;
return $.ajax({
url: _spPageContextInfo.siteAbsoluteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",
type: "POST",
contentType: "application/json;odata=verbose",
data: JSON.stringify(item),
headers: {
"Accept": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"content-Type": "application/json;odata=verbose"
}
});
}
CreateListItemWithDetails(listName, newItemBody)
.then(function(data){
//success callback
var NewlyCreatedItemId = data.d.ID;
}, function(data){
//failure callback
});
Как выполнять операции CRUD с использованием интерфейса REST SharePoint 2010
Создайте
Чтобы выполнить операцию Create через REST, вы должны выполнить следующие действия:
Создайте HTTP-запрос, используя глагол POST
. Используйте URL-адрес службы, в который вы хотите добавить объект в качестве цели для POST. Задайте тип содержимого для application/json
. Сериализуйте объекты JSON, которые представляют ваши новые элементы списка как строку, и добавьте это значение в тело запроса. Пример JavaScript:
function createListItem(webUrl,listName, itemProperties, success, failure) {
$.ajax({
url: webUrl + "/_vti_bin/listdata.svc/" + listName,
type: "POST",
processData: false,
contentType: "application/json;odata=verbose",
data: JSON.stringify(itemProperties),
headers: {
"Accept": "application/json;odata=verbose"
},
success: function (data) {
success(data.d);
},
error: function (data) {
failure(data.responseJSON.error);
}
});
}
использование
var taskProperties = {
'TaskName': 'Order Approval',
'AssignedToId': 12
};
createListItem('https://contoso.sharepoint.com/project/','Tasks',taskProperties,function(task){
console.log('Task' + task.TaskName + ' has been created');
},
function(error){
console.log(JSON.stringify(error));
}
);
Читать
Чтобы выполнить операцию чтения через REST, вы должны выполнить следующие действия:
Создайте HTTP-запрос, используя GET
глагол. Используйте URL-адрес службы элемента списка, к которому вы хотите добавить объект в качестве цели для GET. Задайте тип содержимого для application/json
. Пример JavaScript:
function getListItemById(webUrl,listName, itemId, success, failure) {
var url = webUrl + "/_vti_bin/listdata.svc/" + listName + "(" + itemId + ")";
$.ajax({
url: url,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
success(data.d);
},
error: function (data) {
failure(data.responseJSON.error);
}
});
}
использование
getListItemById('https://contoso.sharepoint.com/project/','Tasks',2,function(taskItem){
console.log(taskItem.TaskName);
},
function(error){
console.log(JSON.stringify(error));
}
);
Обновить
Чтобы обновить существующий объект, вы должны выполнить следующие действия:
Создайте HTTP-запрос, используя глагол POST
. Добавьте заголовок X-HTTP-Method
со значением MERGE
. Используйте URL-адрес службы элемента списка, который вы хотите обновить, в качестве цели для POST. Добавить заголовок If-Match
со значением исходного ETag объекта или *. Пример JavaScript:
function updateListItem(webUrl,listName,itemId,itemProperties,success, failure)
{
getListItemById(webUrl,listName,itemId,function(item){
$.ajax({
type: 'POST',
url: item.__metadata.uri,
contentType: 'application/json',
processData: false,
headers: {
"Accept": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"If-Match": item.__metadata.etag
},
data: Sys.Serialization.JavaScriptSerializer.serialize(itemProperties),
success: function (data) {
success(data);
},
error: function (data) {
failure(data);
}
});
},
function(error){
failure(error);
});
}
использование
var taskProperties = {
'TaskName': 'Approval',
'AssignedToId': 12
};
updateListItem('https://contoso.sharepoint.com/project/','Tasks',2,taskProperties,function(item){
console.log('Task has been updated');
},
function(error){
console.log(JSON.stringify(error));
}
);
удалять
Чтобы удалить объект, необходимо выполнить следующие действия:
Создайте HTTP-запрос, используя глагол POST
. Добавьте заголовок X-HTTP-Method
со значением DELETE
. Используйте URL-адрес службы элемента списка, который вы хотите обновить, в качестве цели для POST. Добавить заголовок If-Match
со значением исходного ETag объекта. Пример JavaScript:
function deleteListItem(webUrl, listName, itemId, success, failure) {
getListItemById(webUrl,listName,itemId,function(item){
$.ajax({
url: item.__metadata.uri,
type: "POST",
headers: {
"Accept": "application/json;odata=verbose",
"X-Http-Method": "DELETE",
"If-Match": item.__metadata.etag
},
success: function (data) {
success();
},
error: function (data) {
failure(data.responseJSON.error);
}
});
},
function (error) {
failure(error);
});
}
использование
deleteListItem('https://contoso.sharepoint.com/project/','Tasks',3,function(){
console.log('Task has been deleted');
},
function(error){
console.log(JSON.stringify(error));
}
);