2016-05-20 12 views
0

WebAPIからSQLでデータを取得しようとしています。私がWebAPIリンクを要求するとき、それは私からの認証を望んでいます。私は以下のスクリプトを使用します。このスクリプトに認証ユーザーを追加するにはどうすればよいですか?ありがとうございました。SQL Serverからwebapiにログオンする方法

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)` 

としては、すでにコンテンツタイプのために行うようにあなたは、単にオブジェクトの上にsetRequestHeaderを呼び出すことができ、このヘッダーを設定するには、Providing authentication info via msxml2.ServerXMLHTTPで説明しました。

承認文字列を作成するには、文字列 "Basic"、ユーザー名、コロン、およびパスワードを連結する必要があります。 T-SQLでこれを行う方法は、Base64 encoding in SQL Server 2005 T-SQLで説明されています。

認証ヘッダーを常に提供することによって、基本的には認証が完全に回避されることに注意してください。実際の流れは次のようにする必要があります:それはWWW-Authenticate: Basic次のようになります。

  1. は、401レスポンスのレスポンスヘッダを検査し、成功ステータスコード(実行される)または401権限
  2. のいずれかを受信未認証の要求
  3. を実行します(または他のものもサポートする必要があります)
  4. Authorization: Basic ...ヘッダーでリクエストを再発行してください。

T-SQLからのHTTPリクエストを手作業で作るのではなく、これを適切に処理する完全なHTTPクライアントを使用したいと思います。

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