首页 > 解决方案 > 从 SQL 查询调用 SharePoint 2016 REST API

问题描述

目前我正在本地工作站上运行 SQL Server 2017。我想从 SQL 存储过程调用 (GET) 我们网络上的 SharePoint 2016 REST API。

在浏览器中使用 REST API url 或使用 PostMan(NTLM 身份验证)时,我成功获得了结果。

当尝试从 SQL 调用相同的 API 时,我不断遇到401 Unauthorized错误。身份验证标头包含与 PostMan 中使用的相同的帐户详细信息。

下面的 SQL 查询返回:

Status: 401 (Unauthorized)
Response text: 401 UNAUTHORIZED

如何修复下面的 SQL 查询以解决此问题?

DECLARE @contentType NVARCHAR(64);
DECLARE @responseText NVARCHAR(2000);
DECLARE @responseXML NVARCHAR(2000);
DECLARE @ret INT;
DECLARE @status NVARCHAR(32);
DECLARE @statusText NVARCHAR(32);
DECLARE @token INT;
DECLARE @url NVARCHAR(256);
DECLARE @authHeader VARCHAR(8000);   

SET @authHeader = 'BASIC ' +(SELECT CAST('<account>:<password>' as varbinary(max)) FOR XML PATH(''), BINARY BASE64)

--SET @contentType = 'application/x-www-form-urlencoded';
SET @contentType = 'application/atom+xml';
SET @url = 'http://<FQDN>/sites/<site>/_api/web/lists/getbytitle(''Documents'')/items';

-- Open the connection.
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token OUT;
IF @ret <> 0 RAISERROR('Unable to open HTTP(S) connection.', 10, 1);

-- Send the request.
EXEC @ret = sp_OAMethod @token, 'open', NULL, 'POST', @url, 'false';
IF @ret <> 0 EXEC sp_OAGetErrorInfo @token

EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Authentication', @authHeader;
IF @ret <> 0 EXEC sp_OAGetErrorInfo @token

EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Content-type', @contentType;
IF @ret <> 0 EXEC sp_OAGetErrorInfo @token

EXEC @ret = sp_OAMethod @token, 'send'--, NULL, @postData;
IF @ret <> 0 EXEC sp_OAGetErrorInfo @token


-- Handle the response.
EXEC @ret = sp_OAGetProperty @token, 'status', @status OUT;
EXEC @ret = sp_OAGetProperty @token, 'statusText', @statusText OUT;
EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;

-- Show the response.
PRINT 'Status: ' + @status + ' (' + @statusText + ')';
PRINT 'Response text: ' + @responseText;

-- Close the connection.
EXEC @ret = sp_OADestroy @token;
IF @ret <> 0 RAISERROR('Unable to close HTTP connection.', 10, 1);

标签: sqlsql-serverapirestsharepoint-2016

解决方案


推荐阅读