uja*_*abu 3 delphi api rest amazon amazon-web-services
我不知道我的代码是对还是错.当我尝试运行程序时出现错误403 ..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ssbase64, StdCtrls,secutils,OmniXMLUtils,OmniXML, xmldom,
XMLIntf, msxmldom, XMLDoc, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP,IdURI;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
XMLDocument1: TXMLDocument;
IdHTTP1: TIdHTTP;
Memo2: TMemo;
Memo3: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function MyEncodeUrl(source:string):string;
var i:integer;
begin
result := '';
for i := 1 to length(source) do
if not (source[i] in ['A'..'Z','a'..'z','0','1'..'9','-','_','~','.']) then result := result + '%'+inttohex(ord(source[i]),2) else result := result + source[i];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
uhost,uri,public_key, private_key,signature,timestamp,string_to_sign : string;
request : String;
begin
uhost := 'ecs.amazonaws.com';
uri := 'onca/xml';
public_key := '1ETPTJHQ37P671HNXXX';
private_key := 'j4JtMHQwL6wR39fy2CJgNfHibLjK9GsC5Z6XXXX';
timestamp := MyEncodeUrl(XMLDateTimeToStr(now));
string_to_sign := 'AWSAccessKeyId=1ETPTJHQ37P671HN9282';
string_to_sign := string_to_sign+ '&AssociateTag=moc-20&ItemPage=1&Keywords=kitchen%20aid&Operation=ItemSearch&ResponseGroup=Large&SearchIndex=Kitchen&';
string_to_sign := string_to_sign+'service=AWSECommerceService&Timestamp='+timestamp;
string_to_sign := string_to_sign+'&Version=2009-03-31';
Memo1.Clear;
Memo1.Lines.Append('GET');
Memo1.Lines.Append('ecs.amazonaws.com');
Memo1.Lines.Append('/onca/xml');
Memo1.Lines.Append(string_to_sign);
signature := StrToMime64(HMACString(haSHA256, private_key, 32, Memo1.Text));
request := 'http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=1ETPTJHQ37P671HN9282';
request := request+ '&AssociateTag=moc-20&ItemPage=1&Keywords=kitchen%20aid&Operation=ItemSearch&ResponseGroup=Large&SearchIndex=Kitchen&';
request := request+'service=AWSECommerceService&Timestamp='+timestamp;
request := request+'&Version=2009-03-31';
request := request+'&Signature='+signature;
Memo1.Text := IdHTTP1.Get(request);
end;
end.
Run Code Online (Sandbox Code Playgroud)
可以任何身体追踪我的错误?
FYI ::
Delphi 7 with build in Indy;
use OmniXML to generate timestamp
use OpenStrSecII to generate signature
Run Code Online (Sandbox Code Playgroud)
亚马逊实际上发回了一份XML文档,该文档准确地描述了为什么会出现403错误.查看消息的最简单方法是使用Fiddler并将Indy HTTP设置127.0.0.1
为代理.这样你的所有流量都通过Fiddler,你会看到你发送的内容和亚马逊返回的内容.
当我实现我的REST API以使用Amazon S3服务时,我在确定需要签名的"Canonical Headers"时遇到了一些问题.令人高兴的是,Amazon API会将您签署的文本发回给您,以测试您的签名,因此您可以逐字节地比较并确定您是否做错了.如果没有准备那些"规范标题",就像准备这些标题一样,这显然会导致403
.例如,Amazon正在使用的行分隔符是LINEFEED(#10
).由于您将标题放在一个中TMemo
,因此您将获得Windows样式的CRLF分隔符.仅此一点就足以让您的代码失败.
我遇到的另一个问题是发送带有我的Indy请求的额外标题.我正在关注在线API样本,看看我应该发送什么以及亚马逊应该回答什么.Fiddler是实际测试和看到我发送的东西的唯一方式,而不是我认为我发送的东西.例如,我错误地用于TIdHttp.Request.RawHeaders
编写自定义标头,但在准备请求时会刷新这些标头.我应该写我的标题TIdHttp.Request.CustomHeaders
- 但没有Fiddler的帮助我不知道我实际上并没有发送我的标题.我的代码看起来很好.
归档时间: |
|
查看次数: |
2854 次 |
最近记录: |