使用GetFileByServerRelativePath/CopyTo创建SharePoint页面时触发400错误
我在Power Automate中创建了一个流,目的是根据SharePoint列表项生成新页面,第一步需要复制模板文件并以列表项标题命名为新页面。但调用SharePoint REST API时反复返回400错误,提示Microsoft.SharePoint.Client.InvalidClientQueryException,开发环境无权限限制,以下是我的请求输入和返回输出:
请求输入
{ "host": { "connectionReferenceName": "shared_sharepointonline", "operationId": "HttpRequest" }, "parameters": { "dataset": "https://myTenant.sharepoint.com/sites/KSDTestSite", "parameters/method": "POST", "parameters/uri": "_api/web/GetFileByServerRelativePath(‘/sites/KSDTestSite/SitePages/Templates/KSD-Template.aspx’)/copyTo(‘/sites/KSDTestSite/SitePages/Microsoft_Security_Update_and_EOL_Notification.aspx')", "parameters/headers": { "Accept": "application/json;odata=verbose", "content-type": "application/json;odata=verbose" } } }
返回输出
{ "statusCode": 400, "headers": { "Pragma": "no-cache", "Cache-Control": "no-store, no-cache", "Set-Cookie": "ARRAffinity=fa5ce4b13622b0d3617b4398e823c470b20f49c8905d33671c1e72b454b4c01b;Path=/;HttpOnly;Secure;Domain=sharepointonline-ncus.azconn-ncus-001.p.azurewebsites.net,ARRAffinitySameSite=fa5ce4b13622b0d3617b4398e823c470b20f49c8905d33671c1e72b454b4c01b;Path=/;HttpOnly;SameSite=None;Secure;Domain=sharepointonline-ncus.azconn-ncus-001.p.azurewebsites.net", "x-ms-request-id": "86e9b9a0-403e-3000-ac9a-13008bc3168f", "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "DENY", "Timing-Allow-Origin": "*", "x-ms-apihub-cached-response": "true", "x-ms-apihub-obo": "false", "Date": "Mon, 05 Jun 2023 16:37:17 GMT", "Content-Length": "750", "Content-Type": "application/json", "Expires": "-1" }, "body": { "status": 400, "message": "The expression \"web/GetFileByServerRelativePath(‘/sites/KSDTestSite/SitePages/Templates/KSD-Template.aspx’)/copyTo(‘/sites/KSDTestSite/SitePages/Microsoft_Security_Update_and_EOL_Notification.aspx')\" is not valid.\r\nclientRequestId: 5b37d689-d8b9-439f-af4f-2005d6b07e0d\r\nserviceRequestId: 86e9b9a0-403e-3000-ac9a-13008bc3168f", "source": "https://myTenant.sharepoint.com/sites/KSDTestSite/_api/web/GetFileByServerRelativePath(%E2%80%98/sites/KSDTestSite/SitePages/Templates/KSD-Template.aspx%E2%80%99)/copyTo(%E2%80%98/sites/KSDTestSite/SitePages/Microsoft_Security_Update_and_EOL_Notification.aspx')", "errors": [ "-1", "Microsoft.SharePoint.Client.InvalidClientQueryException" ] } }
解决思路
- 替换中文单引号为英文单引号:从错误信息的source字段可见,URI中的中文单引号被编码成
%E2%80%98,导致SharePoint API无法正确解析表达式。将所有‘’替换为''是首要修复步骤。 - 简化Server Relative Path:
dataset已指定站点根地址,GetFileByServerRelativePath中的路径可使用相对站点的路径(如/SitePages/Templates/KSD-Template.aspx),无需重复/sites/KSDTestSite,避免路径解析冗余。 - 验证路径有效性:直接在浏览器中访问修正后的API端点(需先登录目标站点),比如
https://myTenant.sharepoint.com/sites/KSDTestSite/_api/web/GetFileByServerRelativePath('/SitePages/Templates/KSD-Template.aspx'),确认能正常返回文件信息,排除路径不存在的问题。 - 处理目标文件冲突:如果目标路径下已存在同名文件,
copyTo默认会报错。可添加第二个参数overwrite=true,修改为copyTo('/SitePages/目标文件名.aspx', true)来覆盖已存在文件。 - 补充安全验证头:若以上步骤无效,尝试添加
X-RequestDigest请求头,值通过调用/_api/contextinfo接口获取,确保请求通过SharePoint的安全验证。
修正后的请求示例
{ "host": { "connectionReferenceName": "shared_sharepointonline", "operationId": "HttpRequest" }, "parameters": { "dataset": "https://myTenant.sharepoint.com/sites/KSDTestSite", "parameters/method": "POST", "parameters/uri": "_api/web/GetFileByServerRelativePath('/SitePages/Templates/KSD-Template.aspx')/copyTo('/SitePages/Microsoft_Security_Update_and_EOL_Notification.aspx', true)", "parameters/headers": { "Accept": "application/json;odata=verbose", "content-type": "application/json;odata=verbose" } } }
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

