2017-12-29 25 views
0

私は、VBAのこの側面を活用することに全く新しいことに気づいて私のポストを序文にします。VBA HTTP POST要求へのパラメータの追加

私は個人的に持っている認証コードを使用してHTTP "POST"リクエストを行う必要があるWebサービスからトークンをリクエストすることに興味があります。私はこのコードを、私の要求の中の他のパラメータの中に含める必要がありますが、それをうまくやって苦労しています。私はオンラインで見つけるどれ詳細は以下の通り(すべてのIDが偽造されている)は、Javaでの彼らの要求をフォーマット:

POST /services/oauth2/token HTTP/1.1 
Host: "YourURL.com" 
grant_type=authorization_code&code=aPrxsmIEeqM9PiQroGEWx1UiMQd95_5JUZ 
VEhsOFhS8EVvbfYBBJli2W5fn3zbo.8hojaNW_1g%3D%3D&client_id=3MVG9lKcPoNI 
NVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCs 
cA9GE&client_secret=1955279925675241571& 
redirect_uri=https%3A%2F%2Fwww.mysite.com%2Fcode_callback.jsp 

このような要求を生産は個人的に本当の闘いとなっています。これらのパラメータは、この要求が失敗する原因となっている理由として

Dim request As WinHttp.WinHttpRequest 
Dim 
    client_id, 
    redirect_uri, 
    grant_type, 
    client_secret, 
    authcode, 
    result, 
    token_url, 
As String 

サブとtestmod()

Set request = New WinHttp.WinHttpRequest 
client_id = "MyClientID" 
client_secret = "MyClientSecret" 
grant_type = "authorization_code" 
redirect_uri = "MyRedirectURI" 
authcode = "MyAuthorizationCode" 
token_url = "MyTokenURL" <--- No specified query string appended 

With request 
    .Open method:="POST", Url:=token_url 
    ''''Including POST Params with Send method'''' 
    .Send ("{""code"":" & authcode & 
    ",""grant_type"":authorization_code,""client_id"":" & client_id & 
    ",""client_secret"":" & client_secret & ",""redirect_uri"":" & 
    redirect_uri & "}") 
    ''''This returns error code 400 denoting a bad request'''' 
    Debug.Print .StatusText 
end with 

エンドサブ

任意のアイデア:以下は私のコードの関連するコンポーネントですか?どんな洞察力も大いにありがとう!

+0

あなたがに投稿しているサーバーによっては、次のようなヘッダーを設定する必要があるかもしれません – garbb

+0

また、私がhttpリクエスト/レスポンスを混乱させて[fiddler]をチェックアウトしている場合(https: //www.telerik.com/fiddler)私は何が起こっているかを見るのに非常に役立つと分かっています。 – garbb

答えて

0

リクエストの体は、構造とすることが必要になる場合があります:

Dim Payload as string 

Payload = "grant_type=" & "authorization_code" & _ 
"&code=" & "BLAHBLAHBLAH" & _ 
"&client_id=" & "OFMICEANDMEN" & _ 
"&client_secret=" & "MELOVEYOULONGTIME" & _ 
"&redirect_uri=" & "YOUMAYHAVETOUSELOOPBACKADDRESSIFYOUHAVENOREDIRECTURL" 

私は上記の置かれているゴミのパラメータ値のそれぞれ(あなた自身で交換するだろうと)の前にURLエンコードする必要がありますあなたはそれらが変更されていない/壊れていないように、リクエストを送信します。一部の値は、URLエンコードする前にbase64でエンコードする必要があります。サーバーがbase64でエンコードされると予想されるものを知るには、APIのドキュメントを参照してください( 'code'の値が最初にbase64でエンコードされ、URLでエンコードされているようです)。

より新しいExcelバージョンでURLエンコーディングを行うことができます。Application.Encode(StringToURLEncode):URLセーフな文字列を返します。

Base64エンコーディングは、関数を作成することによって行うことができます。このサイトでbase64エンコードvbaを検索すると、すぐに使えるサンプルがたくさんあります。

POSTリクエストのボディは、あなたが持っていることを `` { `と`}を持つべきではないかなり確信し
Dim WebClient as WinHttp.WinHttpRequest 
Set Webclient = new winhttp.winhttprequest 

With webclient 
.open "POST", " YOURURL.COM", False 
.setrequestHeader "Content-Type", "application/x-www-form-urlencoded" 
.send Payload 
.waitforresponse 
Debug.print .responsetext 
End with 
関連する問題