1

DevdefinedのOAuthライブラリを使用しながら、DropboxRESTWebサービスにファイルをアップロードしようとしています。

これは私が使用している方法です:

    public static void UploadFile(string filenameIn, string directoryIn, byte[] dataIn)
    {
        DropBox.session.Request().Put().ForUrl("https://api-content.dropbox.com/1/files_put/" + directoryIn + filenameIn)
            .WithQueryParameters(new { param = dataIn });
    }

このメソッドは何も実行しないようで、例外もスローしません。出力にもエラーはありません。ブレークポイントを使用して、コードも呼び出していることを確認してみました。

4

1 に答える 1

3

エラーを受け取らない理由は、リクエストが実行されていないためです-リクエストを実行するには、レスポンスをフェッチする必要があります-これを行う方法はいくつかありますが、多くの場合、最も簡単な方法は、を使用してテキストをフェッチして戻すことです。メソッドReadBody()。

ファイルのコンテンツのアップロードは、クエリパラメータとして実行できません。dropboxRESTAPIの場合と同様に、putリクエストの本文全体がファイルのコンテンツである必要があります。

基本的に、これがすべて機能するためには、次のことを行う必要があります。

  • APIに従ってルートパス「dropbox」または「sandbox」をURLに含めますが、これは欠落していると思います。DropBoxアプリケーションがアプリケーションフォルダで構成されている場合は、「サンドボックス」を使用します。
  • コンシューマーコンテキストで「UseHeaderForOAuthParameters」をtrueに設定して、フォームパラメーターとしてエンコードされるのではなく(本文全体が生データであるため)、OAuth署名などがリクエストヘッダーとして渡されるようにします。
  • 「WithRawContent(byte [] contents)」メソッドを使用して、ファイルのコンテンツをリクエストに追加します。
  • PUTリクエストメソッドチェーンの最後にある「ReadBody()」メソッドを使用して、リクエストを実行します。

結果は、次のようなJSONを含む文字列になります。

{
  "revision": 5, 
  "rev": "5054d8c6e", 
  "thumb_exists": true, 
  "bytes": 5478,
  "modified": "Thu, 29 Dec 2011 10:42:05 +0000",
  "path": "/img_fa06e557-6736-435c-b539-c1586a589565.png", 
  "is_dir": false, 
  "icon": "page_white_picture",
  "root": "app_folder",
  "mime_type": "image/png",
  "size": "5.3KB"
}

githubのDevDefined.OAuth-examplesプロジェクトに例を追加しました。これは、DropBoxを使用してGETおよびPUTリクエストを実行する方法を示しています。

https://github.com/bittercoder/DevDefined.OAuth-Examples/blob/master/src/ExampleDropBoxUpload/Program.cs

そして、putリクエストに特に必要なコードは次のとおりです。

var consumerContext = new OAuthConsumerContext
{
    SignatureMethod = SignatureMethod.HmacSha1,
    ConsumerKey = "key goes here",
    ConsumerSecret = "secret goes here", 
    UseHeaderForOAuthParameters = true
};

var session = new OAuthSession(consumerContext, "https://api.dropbox.com/1/oauth/request_token",
   "https://www.dropbox.com/1/oauth/authorize",
   "https://api.dropbox.com/1/oauth/access_token");

IToken requestToken = session.GetRequestToken();

string authorisationUrl = session.GetUserAuthorizationUrlForToken(requestToken);

Console.WriteLine("Authorization Url: {0}", authorisationUrl);

// ... Authorize request... and then...

session.ExchangeRequestTokenForAccessToken(requestToken);

string putUrl = "https://api-content.dropbox.com/1/files_put/sandbox/some-image.png";

byte[] contents = File.ReadAllBytes("some-image.png");

IConsumerRequest putRequest = session.Request().Put().ForUrl(putUrl).WithRawContent(contents);

string putInfo = putRequest.ReadBody();

Console.WriteLine("Put response: {0}", putInfo);

うまくいけば、それで少し問題が解決するはずですが、残念ながらドキュメントがないと、ソースコードを見るだけでこれらのことを理解するのは少し難しいです:)

于 2011-12-29T10:52:35.183 に答える