【问题标题】:External Sharing of Folders in SharePoint Online using REST API使用 REST API 在 SharePoint Online 中外部共享文件夹
【发布时间】:2017-03-05 03:41:56
【问题描述】:

我是 SharePoint Online 和 REST API 的新手。

我目前正在开发一个 SharePoint 加载项,该加载项在驻留在主机 Web 中的文档库中创建文件夹并将权限共享给指定的外部用户。我目前正在尝试使用 REST API 做所有事情。

我能够成功创建文件夹,但我目前无法将文件夹共享给外部用户

我在尝试使用主机 Web 上下文时无法解析以下端点。下面的第一个端点用于解析外部电子邮件,第二个端点用于将文件夹实际共享给外部用户。

[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 && url.indexOf("$") > -1){
            connector = "&";
        }

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

    return url;
}

return{
    getTargeturl: getTargeturl
}}

您能否帮助验证我是否正确使用了端点以及我正在尝试做的事情是否可行? 感谢您的帮助。

干杯, 尼尔

【问题讨论】:

    标签: javascript jquery rest odata sharepoint-online


    【解决方案1】:

    添加我的解决方案以防万一其他人遇到此问题。 我能够通过以下方式使用 API:

    1. 删除url = WebComponents().getTargetUrl(url, hostUrl)reqUrl = WebComponents().getTargetUrl(reqUrl, hostUrl)
    2. 通过 AppManifest.xmlTenant 中授予应用程序完全控制

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2019-11-28
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多