Внешний доступ к папкам в SharePoint Online с использованием REST API

#javascript #jquery #rest #odata #sharepoint-online

#javascript #jquery #rest #odata #sharepoint-online

Вопрос:

Я новичок в SharePoint Online и REST API.

В настоящее время я работаю над надстройкой SharePoint, которая создает папки в библиотеке документов, размещенной в веб-узле хостинга, и предоставляет разрешение указанным внешним пользователям. В настоящее время я пытаюсь сделать все, используя REST API.

Я успешно могу создавать папки, но в настоящее время я не могу предоставить общий доступ к папкам внешним пользователям.

У меня возникли проблемы с разрешением следующих конечных точек при попытке использовать веб-контекст хоста. Первая конечная точка, приведенная ниже, предназначена для разрешения внешнего сообщения электронной почты, а вторая — для выполнения фактического общего доступа к папке внешнему пользователю.

 [appUrl]/_api/SP.AppContextSite(@target)/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerResolveUser?@target='[hostUrl]'

[appUrl]/_api/SP.AppContextSite(@target)/SP.Web.ShareObject?@target='[hostUrl]'
  

Я получаю сообщение об ошибке 404 Not Found : Cannot find resource for the request SP.UI.ApplicationPages.ClientPeoplerPickerWebServiceInterface.clientPeoplePickerResoveUser . Та же ошибка возникает для SP.Web.ShareObject , когда я пытаюсь принудительно запустить его.

Ниже приведен javascript, который я использую

 var ShareToRecipients = function(folder, recipient, appUrl, hostUrl){

var url = appUrl = "/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerResolveUser";
url = WebComponents().getTargetUrl(url, hostUrl);

var sharedDocUrl = hostUrl   "/ExternalShareDocLib/"   foldername;

var checkUser = $.ajax({
    url: url,
    type: "POST",
    contentType: "application/json;odata=verbose",
    data: JSON.stringify({
        'queryParams': {
            "__metadata": {'type': "SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters"},
            "AllowEmailAddresses": true,
            "AllowMultipleEntities": false,
            "AllUrlZones": false,
            "MaximumEntitySuggestions": 50,
            "PrincipalSource": 15,
            "PrincipalType": 1,
            "QueryString": recipient
        }
    }),
    headers:{
        "accept": "application/json;odata=verbose",
        "X-RequestDigest": $('#__REQUESTDIGEST').val()
    },

    error: function(jqXHR, textStatus){
        myapp.LogAPIError(jqXHR, textStatus)
    }
});

checkUser.success(function(data){
    var user = data.d.ClientPeoplePickerResolveUser;
    var result = JSON.parse(users);

    if(users !== undefined){
        var reqUrl = appUrl   "/_api/SP.Web.ShareObject";
        reqUrl = WebComponents().getTargetUrl(reqUrl, hostUrl);

        var shareCall = $.ajax({
            url: reqUrl,
            type: "POST",
            contentType: "application/json;odata=verbose",
            data: JSON.stringify({
                "url": reqUrl,
                type: "POST",
                contentType: "application/json;odata=verbose",
                data: JSON.stringify({
                    "url": sharedDocUrl,
                    "peoplePickerInput": '['   user   ']',
                    "roleValue": "1073741827",
                    "groupId": 0,
                    "propagateAcl": false,
                    "sendEmail": true,
                    "includeAnonymousLinkInEmail": true,
                    "emailSubject": "A document folder has been shared to you",
                    "emailBody": "A document folder has been shared to you. The folder name is "   folder                       
                })
            });
        });

        shareCall.success(function(data){
            myApp.LogInformation("Successfully shared "   folder   " to "   recipient);
        });

        shareCall.error(function(jqXHR, textStatus){
            myApp.LogAPIError(jqXHR, textStatus);
        });
    }       
});}
  

Для генерации конечной точки URL-адреса хоста

 var WebComponents = function(){
var getTargeturl = function (url, hostUrl){
    if(hostUrl){
        var api = "_api/";

        var index = url.indexOf(api);
        url = url.slice(0, index   api.length) 
        "SP.AppContextSite(@target)"  
        url.slice(index   api.length);

        var connector = "?";
        if(url.indexOf("?") > -1 amp;amp; url.indexOf("$") > -1){
            connector = "amp;";
        }

        url = url   connector   "@target='"   hostUrl   "'";
    }

    return url;
}

return{
    getTargeturl: getTargeturl
}}
  

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

Приветствую, Нил

Ответ №1:

Добавляю свое решение на случай, если кто-нибудь еще столкнется с этой проблемой. Я смог использовать API с помощью:

  1. Удаление url = WebComponents().getTargetUrl(url, hostUrl) и reqUrl = WebComponents().getTargetUrl(reqUrl, hostUrl) .
  2. Предоставление приложению полного контроля в клиенте через AppManifest.xml