Загрузка файла в Dropbox с помощью библиотеки Devdefined OAuth
Я пытаюсь загрузить файл в веб-сервис Dropbox REST, в то же время используя библиотеку OAuth Devdefined.
Это метод, который я использую:
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 });
}
Метод, похоже, ничего не делает и не генерирует никаких исключений. Там нет ошибок в выводе либо. Я попытался использовать точки останова, чтобы подтвердить, что он также вызывает код.
1 ответ
Причина, по которой вы не получаете сообщение об ошибке, заключается в том, что запрос не выполняется - чтобы выполнить запрос, вам нужно получить ответ - есть несколько способов сделать это, но часто самый простой - просто извлечь текст обратно, используя метод ReadBody().
Выгрузка содержимого файла не может быть выполнена в качестве параметра запроса - согласно API REST dropbox, все тело запроса put должно быть содержимым файла.
Для того, чтобы все это работало, вам необходимо:
- Включите корневой путь "dropbox" или "песочница" согласно API в вашем URL, который, я думаю, вам не хватает. Вы используете "песочницу", если ваше приложение DropBox было сконфигурировано с папкой приложения.
- Установите для "UseHeaderForOAuthParameters" значение true в контексте потребителя, чтобы гарантировать, что сигнатура OAuth и т. Д. Передается как заголовки запроса, а не кодируется как параметры формы (поскольку все тело является необработанными данными).
- Используйте метод WithRawContent(byte[] contents), чтобы добавить содержимое файла в запрос.
- Используйте метод "ReadBody()" в самом конце цепочки методов запроса PUT, чтобы запрос был выполнен.
Результатом будет строка, содержащая 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"
}
Я добавил пример в проект DevDefined.OAuth-examples на github, который демонстрирует, как выполнять запросы GET и PUT с DropBox:
А вот код, который требуется для запроса пут:
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);
Надеюсь, это немного прояснит ситуацию, к сожалению, без документации немного сложно разобраться, просто взглянув на исходный код:)