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 パッケージはありますか?