我似乎没有管理使用dropbox api操作的文件副本.我可以成功授权我的客户端,下载和上传文件.复制操作需要使用POST方法,我认为这是我产生错误请求的地方.我正在定义OAuth身份验证的POST方法,并使用Indy TIdHTTP发布请求,但我总是收到错误代码403 - 权限被拒绝.
这是dropbox api描述:https://www.dropbox.com/developers/reference/api#fileops-copy
这是我的代码的一部分:
ParamStr := Format('root=%s&from_path=%s&to_path=%s', [Root, EncodeFileName(FromPath), EncodeFileName(ToPath)]);
URL := 'https://api.dropbox.com/1/fileops/copy' + '?' + ParamStr;
Consumer := TOAuthConsumer.Create(Key, Secret);
AToken := TOAuthToken.Create(fToken, fTokenSecret);
HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create;
ARequest := TOAuthRequest.Create('');
try
ARequest.HTTPURL := URL;
ARequest.Method := 'POST';
ARequest := ARequest.FromConsumerAndToken(Consumer, AToken, '');
ARequest.Sign_Request(HMAC, Consumer, AToken);
Params := TStringList.Create;
try
Params.Text := ParamStr + '&' + ARequest.GetString;
HTTP.Post(URL, Params);
finally
Params.Free;
end;
Run Code Online (Sandbox Code Playgroud) 我想使用TIdHttp(Indy10)实现一个简单的http下载器.我从互联网上找到了两种代码示例.不幸的是,他们都没有100%满足我.这是代码,我想要一些建议.
变式1
var
Buffer: TFileStream;
HttpClient: TIdHttp;
begin
Buffer := TFileStream.Create('somefile.exe', fmCreate or fmShareDenyWrite);
try
HttpClient := TIdHttp.Create(nil);
try
HttpClient.Get('http://somewhere.com/somefile.exe', Buffer); // wait until it is done
finally
HttpClient.Free;
end;
finally
Buffer.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
代码紧凑,易于理解.问题是它在下载开始时分配磁盘空间.另一个问题是我们无法直接在GUI中显示下载进度,除非代码在后台线程中执行(或者我们可以绑定HttpClient.OnWork事件).
变式2:
const
RECV_BUFFER_SIZE = 32768;
var
HttpClient: TIdHttp;
FileSize: Int64;
Buffer: TMemoryStream;
begin
HttpClient := TIdHttp.Create(nil);
try
HttpClient.Head('http://somewhere.com/somefile.exe');
FileSize := HttpClient.Response.ContentLength;
Buffer := TMemoryStream.Create;
try
while Buffer.Size < FileSize do
begin
HttpClient.Request.ContentRangeStart := Buffer.Size;
if Buffer.Size + RECV_BUFFER_SIZE < FileSize then
HttpClient.Request.ContentRangeEnd := Buffer.Size + …Run Code Online (Sandbox Code Playgroud) 如何使用Indy TIdTCPClient并TIdTCPServer在以下场景中使用:
Client ---------- initate connection -----------> Server
...
Client <---------------command------------------- Server
Client ----------------response-----------------> Server
...
Client <---------------command------------------- Server
Client ----------------response-----------------> Server
Run Code Online (Sandbox Code Playgroud)
客户端启动连接,但充当"服务器"(等待命令并执行它们).
该OnExecute的方法TIdTCPServer并不在此情况下(至少我没有得到它的工作好)很好地工作.我怎么能这样做?
我希望这个问题足够清楚.
谁能告诉我哪个更稳定?我知道每个人都有自己的优点和缺点.但哪一个更适合http等?
在我之前的应用程序中,我使用了indy9,但我对它不满意,因为我有时会遇到奇怪的错误.
谁能推荐一个人?
在Delphi中执行HTTPS POST请求的最简单方法是什么?我在发出HTTP POST请求时遇到问题,但是如何使用SSL呢?我已经google了一下,并没有发现任何能够解释得很好的东西.
这是我试过的代码:
procedure TForm1.FormCreate(Sender: TObject);
var
responseXML:TMemoryStream;
responseFromServer:string;
begin
responseXML := TMemoryStream.Create;
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(self);
with idSSLIOHandlerSocketOpenSSL1 do
begin
SSLOptions.Method := sslvSSLv2;
SSLOptions.Mode := sslmUnassigned;
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 0;
host := '';
end;
IdHTTP1 := TIdHTTP.Create(Self);
with IdHTTP1 do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.Accept := 'text/html, */*';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := …Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到谷歌文档(遵循Marco Cantu的优秀REST示例),但我收到以下SSL错误:
1)如果我使用openssl-0.9.8i-i386-win32.zip中的SSL dlls,我收到错误:
"无法加载SSL库"
2)如果我使用indy_OpenSSL096m.zip中的SSL dll我得到错误:
"与SSL连接时出错"
3)如果我使用openssl-0.9.8h-i386-win32-Indy-IntraWebEdition.zip中的SSL dlls我得到错误:
"无法加载SSl库"
现在我已经研究了这个,并且有很多关于dll死链接的建议,包括堆栈溢出的链接.我怀疑我需要找到与我正在使用的INDY版本兼容的SSL dll.
我的问题是,有没有人确切知道哪些SSL dll与Delphi 2006和INDY 10.1.5兼容?
有人可以帮助告诉有关如何卸载Indy 10并安装最新版本的详细信息吗?我找到了它http://indy.fulgan.com/ZIP/IndyTiburon.zip
有一个类似的问题,但不是一个令人满意的答案,只是来自用户的一些评论,但这不是一步一步的指导.
为什么没有这个工具?
我创建了一个使用openssl dll(libeay32.dll和ssleay32.dll)的应用程序.使用它们是indy,我不直接调用dll.
我发现最简单的解决方法是避免使用安装程序(我只是删除了一个exe,我对这种方法没问题)是:
这是完美的,但我想通过提取临时文件夹中的dll而不是exe文件夹(在许多情况下是桌面)来改进方法.
问题是我不知道如何强制应用程序在temp文件夹中使用dll,因为现在的行为是:如果dll不在当前目录中,则尝试搜索系统路径中定义的目录.
谁知道迫使indy在我的临时路径中使用dll的解决方案?(比如"临时登记dlls")
我需要一个简单的代码样本用于Indy 10 Http Server当请求(post)只显示它是否有一个Indy 9样本?谢谢
delphi ×10
indy ×10
indy10 ×3
http ×2
openssl ×2
delphi-2006 ×1
delphi-2009 ×1
delphi-7 ×1
delphi-xe ×1
dll ×1
download ×1
dropbox-api ×1
idhttp ×1
oauth ×1
ssl ×1