如何使用R读取本地部署(on premise)的SharePoint列表?
问题诊断
- 所有失败方案的核心问题是没有调用SharePoint官方提供的结构化数据接口,直接请求前端渲染的列表页面URL,返回的本就是带特殊命名空间、自定义HTML属性的非结构化页面源码,自然会出现XML解析报错、拿到的内容是HTML源码的问题
- 身份认证环节要么没有适配本地SharePoint的NTLM/AD认证规则,要么权限范围未覆盖列表数据读取权限,所以会出现401、无法打开连接的报错
正确读取方案
本地部署的SharePoint默认开放REST API接口,直接调用接口拉取结构化列表数据即可,无需解析前端页面,实现步骤如下:
- 前置准备:安装依赖包
执行命令安装所需工具包:install.packages(c("httr", "jsonlite")) - 构造请求地址
将下列地址中的占位符替换为你的实际信息,得到接口请求地址:http://<你的SharePoint站点根地址>/_api/web/lists/getbytitle('<目标列表的显示名称>')/items?$top=5000
注:$top=5000是单次请求拉取的最大数据量,超过5000条需要分页拉取 - 完整实现代码
# 加载依赖包 library(httr) library(jsonlite) # 配置基础信息,替换为实际值 sp_site_url <- "http://你的本地SharePoint站点根地址" target_list_name <- "你的目标列表显示名" ad_username <- "域\\用户名" ad_password <- "你的账号密码" # 拼接完整接口地址 api_url <- paste0(sp_site_url, "/_api/web/lists/getbytitle('", target_list_name, "')/items?$top=5000") # 发起带NTLM认证的请求 resp <- GET( url = api_url, authenticate(user = ad_username, password = ad_password, type = "ntlm"), add_headers(Accept = "application/json;odata=nometadata") ) # 解析结果 if (status_code(resp) == 200) { # 解析返回的json为数据框 sp_list_df <- fromJSON(content(resp, as = "text", encoding = "UTF-8"))$value # 输出前几行验证 head(sp_list_df) } else { stop(paste("请求失败,状态码:", status_code(resp))) }
注意事项
- 如果本地SharePoint配置了Kerberos认证,将
authenticate函数的type参数改为"negotiate"即可 - 数据量超过5000条时,循环传入
$skiptoken=ID=<上次最后一条数据的ID>参数即可实现分页拉取 - 禁止直接请求列表的前端查看页面地址,必须调用
/_api开头的官方接口才能拿到结构化数据
内容的提问来源于stack exchange,提问作者M八七
相关产品推荐
相关产品推荐

