2016-05-20 2 views
0

Я пытаюсь получить данные из WebAPI в SQL. Когда я запрашиваю ссылку WebAPI, он хочет получить от меня подтверждение. Я использую ниже сценарий. Как добавить пользователя аутентификации в этот скрипт? Спасибо.Как подключиться к webapi из SQL Server

Authentication screen in web browser

Код:

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000); 
Declare @Body as varchar(8000) = 
'{ 
    "Subsystem": 1, 
    "Exception": "", 
    "Message": "I have done what you asked", 
    "Time": "2014-06-09T11:16:35", 
    "Attribute": { "Number of attempts": "0" } 
}' 

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT; 
EXEC sp_OAMethod @Object, 'open', NULL, 'post','http://server/ws/v1/GET_DATA', 'false' 

Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json' 
Exec sp_OAMethod @Object, 'send', null, @body 

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT 
Select @ResponseText 

Exec sp_OADestroy @Object 
+0

Я хочу передать имя пользователя и пароль из sql. я искал в Интернете, но я ничего не мог найти. что webapi хочет базовую аутентификацию, и мне нужно передать это имя пользователя и пароль. –

ответ

0

Как всплывающее окно показывает, сайт использует обычную проверку подлинности. Это реализуется в виде заголовка запроса:

Authorization: Basic `base64(user:pass)` 

Как объяснено в Providing authentication info via msxml2.ServerXMLHTTP, чтобы установить этот заголовок, вы можете просто вызвать setRequestHeader на объекте, как вы уже делаете для типа содержимого.

Теперь, чтобы создать строку авторизации, вам необходимо объединить строку «Basic», имя пользователя, двоеточие и пароль. Как это сделать в T-SQL объясняется в Base64 encoding in SQL Server 2005 T-SQL.

Обратите внимание, что, всегда предоставляя заголовок авторизации, вы в основном обходите аутентификацию полностью. На самом деле поток должен быть таким:

  1. Выполните неавторизованный запрос
  2. получающего либо код состояния успеха (сделано) или 401 Несанкционированное
  3. Осмотреть заголовки отклика, что 401 ответ: он должен быть WWW-Authenticate: Basic (или другие, которые вам также необходимо будет поддерживать)
  4. Повторно выдайте запрос с заголовком Authorization: Basic ....

Таким образом, я бы предпочел использовать полностью обработанный HTTP-клиент, который должным образом обрабатывает это, в отличие от обработки HTTP-запросов с использованием T-SQL вручную.

0

Я решил проблему с нижеследующими кодами.

CREATE proc HTTPRequest 
     @URI varchar(2000) = '',  
     @methodName varchar(50) = '', 
     @requestBody varchar(8000) = '', 
     @SoapAction varchar(255), 
     @UserName nvarchar(100), -- Domain\UserName or UserName 
     @Password nvarchar(100), 
     @responseText varchar(8000) output 
as 
SET NOCOUNT ON 
IF @methodName = '' 
BEGIN 
     select FailPoint = 'Method Name must be set' 
     return 
END 
set @responseText = 'FAILED' 
DECLARE @objectID int 
DECLARE @hResult int 
DECLARE @source varchar(255), @desc varchar(255) 
EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
        source = @source, 
        description = @desc, 
        FailPoint = 'Create failed', 
        MedthodName = @methodName 
     goto destroy 
     return 
END 
-- open the destination URI with Specified method 
EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false', @UserName, @Password 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'Open failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 
-- set request headers 
--EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'text/xml;charset=UTF-8' 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'application/json' 

IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'SetRequestHeader failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 
-- set soap action 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'SOAPAction', @SoapAction 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'SetRequestHeader failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 
declare @len int 
set @len = len(@requestBody) 
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Length', @len 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'SetRequestHeader failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 

-- send the request 
EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'Send failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 
declare @statusText varchar(1000), @status varchar(1000) 
-- Get status text 
exec sp_OAGetProperty @objectID, 'StatusText', @statusText out 
exec sp_OAGetProperty @objectID, 'Status', @status out 
--select @status, @statusText, @methodName --kapattım 
-- Get response text 
exec sp_OAGetProperty @objectID, 'responseText', @responseText out 
IF @hResult <> 0 
BEGIN 
     EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT 
     SELECT  hResult = convert(varbinary(4), @hResult), 
      source = @source, 
      description = @desc, 
      FailPoint = 'ResponseText failed', 
      MedthodName = @methodName 
     goto destroy 
     return 
END 
destroy: 

select @responseText 
SELECT DECOMPRESS (Attachment, 'gzip') 
FROM @responseText; 
--select NAME , StringValue from parseJSON(@responseText) 

    exec sp_OADestroy @objectID 

SET NOCOUNT OFF 
Смежные вопросы