问题
For SharePoint Online connector We used following steps to fetch all sites:
Step 1: Created Add-in on SharePoint instance with following permission xml
<AppPermissionRequests>
<AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl"/>
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="Read"/>
</AppPermissionRequests>
Step 2: Used below API to get all sites and subsites
https://<site_name>.sharepoint.com/_api/search/query?querytext='contentclass:STS_Site' &rowlimit=100
Issue we are facing –
- Above endpoint is returning all
sites, sub sites along with user’s personal site(One drive)
, while we need allsites and sub sites
only. - Please suggest minimal required permission to read all site, all subsite, all folders and files metadata
We referred following links:
- http://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/
- https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/add-in-permissions-in-sharepoint
- https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/get-to-know-the-sharepoint-rest-service
回答1:
You should add a path filter in the endpoint.
Normal site collections have a path like https://tenant.sharepoint.com
whereas personal (One Drive) site collections have path like https://tenant-my.sharepoint.com/personal/*
.
So, modify your endpoint as below:
https://<site_name>.sharepoint.com/_api/search/query?querytext='contentclass:STS_Site
Path:"https://<site_name>.sharepoint.com/*"'&rowlimit=500
This will only return site collections starting with https://<site_name>.sharepoint.com
path and will exclude the One Drive site collections which are on a different path.
回答2:
A way from Joel Dsouza for your reference.
1.The First Ajax is to get the Root Site Title and the Relative URL.
$.ajax({
url: _spPageContextInfo.siteAbsoluteUrl + "/_api/site/rootweb?$select=Title,ServerRelativeUrl",
method: "GET",
headers: {
"Accept": "application/json; odata=verbose"
},
success: function(rootsite) {
},
error: function(rootsite) {},
async: false
});
2.The Second AJAX is to get all the sub sites under the Root Site.
$.ajax({
url: _spPageContextInfo.siteAbsoluteUrl + "/_api/web/webinfos?$select=ServerRelativeUrl,Title",
method: "GET",
headers: {
"Accept": "application/json; odata=verbose"
},
success: function(subsites) {
$.each(subsites.d.results, function() {
getSubSites(this.ServerRelativeUrl, this.Title);
});
},
error: function(subsites) {},
async: false
});
3.This is a Recursive Function to loop through the sub sites and check for more sub sites.
function getSubSites(SubSiteUrl, SubSiteTitle) {
console.log(SubSiteUrl);
$.ajax({
url: _spPageContextInfo.siteAbsoluteUrl + SubSiteUrl + "/_api/web/webinfos?$select=ServerRelativeUrl,Title",
method: "GET",
headers: {
"Accept": "application/json; odata=verbose"
},
success: function(subsites) {
$.each(subsites.d.results, function(index) {
getSubSites(this.ServerRelativeUrl, this.Title);
});
},
error: function(subsites) {},
async: false
});
}
More information: Get All Sites and Sub Sites using REST API
回答3:
https://yoursharepointsite.com/_api/search/query?querytext='(contentclass:STS_Site) (contentclass:STS_Web)'&trimduplicates=false&rowlimit=5000&selectproperties='Title,Url,Path,ParentLink'"
The above rest url shoul give you all the Sites and subsite the user has access to. You may need to trim duplicates.
来源:https://stackoverflow.com/questions/51616560/sharepoint-get-all-sites-and-all-sub-sites-using-sharepoint-online-rest-api