16

RCurlパッケージを使用してPiCloud の REST APIに R ラッパーを実装し、API サーバーへの HTTP(S) リクエストを作成しています。API は基本 HTTP 認証を使用して、ユーザーが十分な権限を持っていることを確認します。PiCloud のドキュメントには、API を使用して curl で認証する例が示されています。

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

これは完全に機能します。これを同等の RCurl のコマンドに変換します。

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

この関数を実行すると、次のエラー メッセージが表示されます。

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

この問題をさらに詳しく調べてみると、curl コマンドによって作成された HTTP リクエストの最初の GET コマンドに Authorization フィールドが含まれていることがわかりました。

RCurl はこれを行いません。代わりに、最初に認証フィールドを設定せずに GET リクエストを送信します。401 エラー コードと WWW-Authenticate フィールドを含む応答を受信すると、Authorization フィールドを含む別の GET 要求を送信します。

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

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

4

2 に答える 2

28

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

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

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

于 2012-04-15T14:41:06.187 に答える
8

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

library(httr)
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))
于 2014-07-30T20:39:13.277 に答える