本篇文章将介绍以主用户模式调用REST API来访问或处理SharePoint Online上的文件,主要用于没有SharePoint官方接口的应用程序或需要以编程方式访问SharePoint时的场景。
获取访问令牌
在调用SharePoint的REST API前,需要先获取到访问令牌,可以使用主用户模式或服务主体模式。但通过服务主体模式访问Azure应用来获取访问令牌时,需要使用PowerShell生成并上传证书,且最后调用时较麻烦,因此本篇文章只介绍主用户模式。而关于服务主体模式,将改用SharePoint应用来实现,相比Azure应用简单不少,这将在另一篇文章中进行介绍。
关于获取访问令牌的具体步骤与原理,请参考我的另一篇文章:Azure应用注册与访问令牌获取,并从该文章末尾处复制给出的现成代码,然后填写相关参数,并把验证模式设置为主用户模式即可。此外,由于后续需要调用的是SharePoint的REST API,因此还需要填写SCOPE URL,具体如下图所示:
需要注意,这里必须将验证模式设置为主用户模式,若改用服务主体模式将报错,因为给出的现成代码是通过Azure应用的客户端密码来实现服务主体模式的,而不是上传证书。正如之前所提到的,通过服务主体模式访问Azure应用来获取访问令牌时需要使用上传证书的方式,因为其它方式都被屏蔽了。
调用REST API读取SharePoint上的文件
SharePoint的REST API有很多,这里只介绍读取文件所用到的API,若对其它API感兴趣,可以自行浏览官方文档:了解 SharePoint REST 服务。
API接口:
Url:https://{site_url}/_api/web/GetFolderByServerRelativeUrl('{folder_path}')/Files('{file_name}')/$value
Method:GET
Request Headers: {Authorization:访问令牌}
参数说明:
1. site_url
SharePoint站点的根目录,可打开对应的SharePoint站点后从浏览器上方的地址栏处获得,格式为:https://TenantName.sharepoint.com/sites/SiteName
2. folder_path
需要读取的文件所位于的文件夹的路径,可使用绝对路径或相对路径。绝对路径以/SiteName为起点,注意前面的斜杠;相对路径则以Shared Documents为起点,注意前面是没有斜杠的。
为帮助理解,以下图所示的Excel文件所在位置为例,其所位于的文件夹的路径为:
绝对路径:/SharePointRESTAPIReadFile/Shared Documents/TestFolder
相对路径:Shared Documents/TestFolder
3. file_name
需要读取的文件的文件名,含格式后缀
4. Authorization
前面获取到的访问令牌,需要作为请求头参数传递
当所有参数都获取到后,就可以调用该REST API读取文件了。以Python为例,调用REST API读取文件的代码如下:
site_url = "https://TenantName.sharepoint.com/sites/SiteName"
response = requests.get(
"{0}/_api/web/GetFolderByServerRelativeUrl('Shared Documents/FolderName1/FolderName2/../FolderName')/Files('ExcelFileName.xlsx')/$value".format(site_url),
headers={'Authorization':token}
)
if response.status_code in [200,202]:
with io.BytesIO(response.content) as fh:
df = pd.read_excel(fh, sheet_name='SheetName')
print(df)
else:
print(response.text)
完整的实现代码
为方便使用,下面给出从获取访问令牌到调用REST API读取SharePoint文件的完整实现代码,有多个版本,但都需要使用主用户模式,不支持服务主体模式。