2012-02-14 8 views
3

Amazon Product Advertising APIを使用して、サイトでの価格改定を行っています。それを知らない人にとっては、基本的には、Webページを掻き集めるなどの時間を費やす操作をすることなく、Amazonデータベースを相互参照することができます。それは私たちのために非常にうまくいく、または持っています。彼らは現在、このAPIを販売者向けに解散し、MWSサービスで新しいAPIに移行しています。Delphi 2007でAmazonへのHTTPS POSTコールを行う

私の見る限りでは、呼び出しは微妙に異なります。 2つの明らかな違いは、PAF APIがHTTPとGETを使用し、MWSがHTTPSとPOSTを使用している点です。

ハッシュで署名されたURLリクエストを作成する例があるため、Amazonのマニュアルの例が正しいことは完全にはわかりません。これは、GETメソッドが使用されていたPA-APIで正常に実行された方法です。しかしPOSTのためにそれを行うことはできますか?私はそれが可能だとは思わない、私は間違っているかもしれませんが、それは確かに例が意味するものです。

とにかく、署名付きURLを作成しても機能しません。だから私はDelphiで何らかの低レベルのHTTPS POSTを使用する行を調べることにしました。

私はここで検索しましたが、いくつかの異なる例がありますが、正しく動作するようにはできません。いくつかの例ではINDY 10を使用しているようですが、残念ながらINDY 9では互換性の理由でスタックされています.WININETラッパータイプの関数も見てきましたが、例外やエラー以外の結果を返すことはできません。

私はここにいくつかの助けを求めているのです。

デルファイを使用してAmazon MWSに正しくフォーマットされた呼び出しを行うにはどうすればよいですか?

How to make an HTTPS POST request in Delphi?

などなど、私が見つけることができるすべてのもの:私のようなページからの例を試してみました!

しかし、私は「悪い要求」(例外)のようなエラーを返す。

私は(他の場所で示唆したように)何が起こっているかを見るためにバイオリンを使用して試してみましたが、かなりまだそれのまわりで私の頭を取得することはできません(私が働くことで、コールを構成することができますが!)

をだから私はこれに関するいくつかの指針や方向性を探しています。私は本当にINDYをアップグレードしたり、新しいライブラリを追加したりしたくありません。私はただのものをそのまま保ち、私が利用できるものを使うことを好むでしょう。私たちはD2007を使用しています。

必要とされるもののアイデアを与えるために、私はコールのこの種(GetServiceStatusが最も簡単なもの)を作成する必要があります。このエンドポイントへの

POST /Products/2011-10-01?AWSAccessKeyId=<ACCESSKEY> 
    &Action=GetServiceStatus 
    &SellerId=<SELLERID> 
    &SignatureVersion=2 
    &Timestamp=2012-02-14T13%3A26%3A42Z 
    &Version=2011-10-01 
    &Signature=dtAvv595blmv%2FnV0h2Yr5bCGzKYXid0hkOuCmZOb3bc%3D 
    &SignatureMethod=HmacSHA256 

を:

https://mws.amazonservices.co.uk/Products/2011-10-01

I私の問題は私が試したすべての例にあると思う私はコールを正しく設定する方法を知らないので、おそらくバッドリクエストエラーが出るのです。

だから、すてきな簡単な解決策が最も高く評価されます。


ドキュメントのリンクと観測:

これは、APIの開発者向けのガイドです:

https://images-na.ssl-images-amazon.com/images/G/02/mwsportal/doc/en_US/bde/MWSDeveloperGuide._V161846143_.pdf

これは置き換え我々が使用するAPIの特定の部分(あります現在の商品広告API):

https://images-na.ssl-images-amazon.com/images/G/02/mwsportal/doc/en_US/bde/MWSDeveloperGuide._V161846143_.pdf

ここで最も基本的な機能は、GetServiceStatus関数です。パラメータは必要ありません。しかし、アマゾンからの資格情報(売り手ID、MWSアクセスキー、秘密鍵(署名を生成するため))を使って認証され、署名されている必要があります。休憩が続きますが、認証の問題は解決策を見つけることが非常に困難になることです。テストアカウントはありません。また、タイムスタンプ(したがって呼び出しの署名)も期限切れになり、数分です。

「移行ガイド」:。。

https://images-na.ssl-images-amazon.com/images/G/02/mwsportal/doc/en_US/products/MWSProductsApiMigrationGuide._V140058392_.pdf

しかし、この文書は、例えば、エンドポイントが間違っているいくつかのエラーが含まれてい


私の最新のコードINC SSL、クッキーマネージャなど:

var 
    LHTTP    : TIdHTTP; 
    IdSSLIOHandlerSocket : TIdSSLIOHandlerSocket; 
    IdCookieManager  : TIdCookieManager; 
    LParams    : TStringList; 
    LResponse   : string; 

begin 
    IdCookieManager:=TIdCookieManager.Create(self); 
    IdSSLIOHandlerSocket:=TIdSSLIOHandlerSocket.Create(self); 
    with IdSSLIOHandlerSocket do begin 
    SSLOptions.Method := sslvSSLv3; 
    end; 

    LHTTP := TIdHTTP.Create(Self); 
    with LHTTP do begin 
    CookieManager:=IdCookieManager; 
    AllowCookies:=true; 
    IOHandler:=IdSSLIOHandlerSocket; 
    Request.ContentType:='text/xml'; 
    Port:=443; 
    HandleRedirects:=true; 
    Host:='mws.amazonservices.co.uk'; 
    ProtocolVersion:=pv1_1 
    end; 


    LParams := TStringList.Create; 
    try 
    LParams.Add('AWSAccessKeyId=<ACCESSKEY>'); 
    LParams.Add('Action=GetServiceStatus'); 
    LParams.Add('SellerId=<SELLERID>)'); 
    LParams.Add('SignatureVersion=2'); 
    LParams.Add('Timestamp=2012-02-15T13%3A00%3A07Z'); 
    LParams.Add('Version=2011-10-01'); 
    LParams.Add('Signature=viPlDAbzEBwlTAwq4hNaZi%2Fa1Klf7qIXIP%2BKUsOcJTI%3D'); 
    LParams.Add('SignatureMethod=HmacSHA256'); 
    LResponse:=LHTTP.Post('https://mws.amazonservices.co.uk/Products/2011-10-01?', LParams); 
    ShowMessage(LResponse); 
    except 
    on E: Exception do 
     ShowMessage('ouch! ' + E.Message); 
    end; 
    LHTTP.Free; 
    IdSSLIOHandlerSocket.Free; 
    IdCookieManager.Free; 
end; 

これはAmazonがそのスクラッチパッドごとに受け取ることを期待しているものに基づいています。最後に、ユーザエージェントはオプションで、必要なものではなく、署名プロセスの一部ではありません。私はフィドラーから情報を取得しようとしてい

POST /Products/2011-10-01?AWSAccessKeyId=<ACCESSID> 
    &Action=GetServiceStatus 
    &SellerId=<SELLERID> 
    &SignatureVersion=2 
    &Timestamp=2012-02-15T13%3A00%3A07Z 
    &Version=2011-10-01 
    &Signature=viPlDAbzEBwlTAwq4hNaZi%2Fa1Klf7qIXIP%2BKUsOcJTI%3D 
    &SignatureMethod=HmacSHA256 HTTP/1.1 
Host: mws.amazonservices.co.uk 
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript) 
Content-Type: text/xml 

が、それはソフトウェアからのすべてのトラフィックを示していないが、それは必要があります「400の悪い要求」エラーを得るためにAmazonと通信している。奇妙な

+0

に動作します実装する。 Delphiの開発者とAmazonの売り手の両方を待っている他の方法があるため、できるだけ簡単に誰かが手伝ってください。あなたが十分な仕事をするならば、私はアマゾンの売り手でなくてもこれを試すことができます:例えば、売り手でなくてもできる質問がありますか? Amazonは私たちが使用できるテストアカウントを提供していますか? –

+0

こんにちはCosmin。コメントありがとう。もちろん、あなたは100%正しいです。私の脳はこれを整理しようとしているパテのようになっていて、ドキュメンテーションのリンクが役立つようになりました。私は仕事場でリンクしています。私は再び投稿することができます(私は初心者の投稿に制限があるようです)私はリンクを投稿します。残念ながら彼らはテストアカウントではありません。そして、署名プロセスは、売り手ID、mwsアクセスID&秘密鍵を使用してコールに署名することで非常に安全です。だから私は、これがこれをはるかに難しくしていく過程全体を理解することに感謝します。タイムスタンプに追加すると、まだ難しくなります。しかし、私は明日のdocリンクを投稿します。 – Trevor

+0

あなたは「投稿する」とは思われません。あなたは現在の質問を編集し、関連する詳細を追加することになっています。あなたの質問のタグリストの下に 'edit'リンクがあります。それがこのサイトの仕組みです:議論の場ではなく、Q&Aサイトです。 –

答えて

4

私は、TIdHTTPで行く(当てはまる場合)HTTPOptionsであなたの資格情報を使用してそれを設定してからだろう。

procedure ... 
var 
    LHTTP: TIdHTTP; 
    LParams: TStringList; 
    LResponse: string; 
begin 
    LHTTP := TIdHTTTP.Create; 
    LParams := TStringList.Create; 
    try 
    // setup params, basically you're doing key-value pairs that will be encoded in the post 
    // as KEY1=VALUE1&key2=value2&KEY3=value3, etc. 
    // in the URL, stuff after ? are parameters 
    // you don't have to worry about encoding parameters, indy will do it for you 
    LParams['AWSAccessKeyId'] := '<ACCESSKEY>'; 
    LParams['Action'] := 'GetServiceStatus'; 
    LParams['SellerId'] := '<SELLERID>' 
    LParams['SignatureVersion'] := '2'; 
    // adjust timestamp 
    LParams['Timestamp'] := '2012-02-14T13%3A26%3A42Z'; 
    LParams['Version'] := '2011-10-01' 
    // adjust signature... 
    LParams['Signature'] := 'dtAvv595blmv%2FnV0h2Yr5bCGzKYXid0hkOuCmZOb3bc%3D'; 
    LParams['SignatureMethod'] := 'HmacSHA256'; 
    LResponse := LHTTP.Post('https://mws.amazonservices.co.uk/Products/2011-10-01', LParams); 
    ShowMessage(LResponse); 
    except 
    on E: Exception do 
     ShowMessage('ouch! ' + E.Message); 
    end; 
end; 

私はあなたが「/製品/ 2011-10-01」を交換する必要があると思います日付とあなただけの検索、すなわち「/製品/ 2012-02-14」だと私は間違っていない場合ように...

また、SSLのLIBSが必要とされている...

+0

こんにちはドーリン。返信いただきありがとうございます。あなたのコードを使って、ssl呼び出しのために少し修正しました。しかし、まだ "悪い要求"を得る。私は新しいコードを投稿しようとしていましたが、もう一度投稿できるようにするための制限があると思います。コードは私の仕事のラップトップにあります。私は朝に仕事をすると、まずそれを投稿します。ありがとう、トレバー。 – Trevor

+0

まあ、よく... APIドキュメントに戻る...リダイレクトを有効にしようとする必要がありますか? – ComputerSaysNo

+0

Dorin、あなたの答えに自分のコードを加え、オリジナルの質問に追加したドキュメントへのリンクを追加しました。ドキュメントをもう一度見てきました。スクラッチパッドで動作しているときと、呼び出しを作成するときにFiddlerを使用しているときに、パラメータとシグネチャが正しいことがわかりました。だから、私はDelphiから呼び出しを作成している方法とは何か関係があります。 – Trevor

1

誰もが私がこの作業のためのPOSTソリューションを手に入れようとすることを断念したことを知らせるために、私はあまりにも多くのストレスを感じていました。結果を浪費し、プログラミング時間を無駄にする。

代わりに、基本に戻ってPOSTの代わりにGETに署名するように文字列を変更し、パラメータ化されたURLを作成してXML結果を取得しました。

技術的にも審美的にも最高の解決策ではないかもしれませんが、ちょっと、うまくいきます!

eveyoneの助けとアドバイスありがとう、ありがとう。ちょうどあなたが知っているようにする

1

、私は最終的に手動

ソートUTF-8クエリ文字列コンポーネントのパラメータ名で自然バイト順序とを読んで、最終的にはGET形式に行き、この問題にあなたの痛みを共有しました。パラメータは、 をGET URIまたはPOST本体から取得できます(Content-Typeがapplication/x-www-form-urlencodedの場合)。

あなたは、ヘッダーで、上記のようにコンテンツタイプを設定した場合、それはおそらく、あなたはあなたが好きなクエリの非常に特定の種類を使用して選択しようとしているサービスのドキュメントにリンクする必要があり

関連する問題