2012-04-14 17 views
14

RCurlパッケージを使用してPiCloud's REST APIのRラッパーを実装して、APIサーバーへのHTTP(S)要求を行っています。 APIは基本的なHTTP認証を使用して、ユーザーに十分なアクセス許可があることを確認します。 PiCloudのドキュメントでは、APIを使用し、カールで認証する例を示しています。RCurl:サイトがWWW認証なしでHTTP 401コードで応答したときのHTTP認証

$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12 

これは完全に機能します。同等のRCurlのコマンドにこれを翻訳:私はcurlコマンドによって行われたHTTPリクエストが含まことを発見し、より深さの問題を探る

[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}" 

この機能を実行する
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret") 

私は、次のエラーメッセージが表示されます。最初のGETコマンドのAuthorizationフィールド。

RCurlはこれを行いません。その代わりに、最初に許可フィールドが設定されていないGET要求を送信します。 401エラーコードとWWW-Authenticateフィールドの応答を受け取った場合は、Authorizationフィールドで別のGET要求を送信します。

HTTP仕様では、WWW-Authenticateフィールドを含めるために401エラーコードで返されるメッセージが必要ですが、PiCloud APIメッセージには含まれていません。したがって、userpwdオプションを指定してもgetURLを呼び出すと、RCurlは許可フィールドが設定されたGET要求を送信しません。その結果、認証は常に失敗します。

RCurlに送信する最初のGETメッセージのAuthorizationフィールドを強制的に設定する方法はありますか?そうでない場合は、私が調べることができる他のRパッケージがありますか?

答えて

23

私はRCurl、Duncan Langの著者の助けを借りて問題を解決しました。解決方法は、最初に試して認証方法を設定するhttpauthオプションを明示的に設定することです。これは動作します:

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L) 

httpauthは使用する認証方法を指定するビットマスクです。詳細については、HTTP認証セクションのthe libcurl tutorialを参照してください。

+1

私は時間のためにこれを追跡しようとしてきました。ありがとう! –

+0

再利用可能なカールハンドルを渡す場合は、 'getCurlHandle()'の呼び出しで 'httpauth = 1'を設定する必要があります。 (これは 'postForm()'が基本認証で動作する唯一の方法でした: 'httpauth'を' postForm() 'のパラメータとして渡しても動作しませんでした) –

6

HTTRでの同等のコードは次のとおりです。

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))