1

現在、Salesforce で Amazon Product Retail Web Service を呼び出そうとしています。

Salesforce で WSDL から Apex コードを生成中に WSDL 解析エラーを取得するで述べたように

最初は apex スタブ クラスを生成できませんでしたが、@Ballinger によって提案された方法に従って、apex クラスを作成しました。そのスタブを使用し、リクエスト パラメータを設定する apex クラスを作成しました。私が書いたクラスは次のとおりです

public class AmazonProductStubNew
{
 public static void getResults()
 { 
        System.Debug(' getResults start ');
        AmazonWS.AWSECommerceServicePortUS stub = new AmazonWS.AWSECommerceServicePortUS();

        stub.inputHttpHeaders_x = new Map<String,String>();
        stub.inputHttpHeaders_x.put('AWSAccessKeyId','MyAmazonAWSAccessKeyId');
        stub.inputHttpHeaders_x.put('Timestamp','2012-11-28T12:11:30Z');
        stub.inputHttpHeaders_x.put('Signature','Encrypted Secret Code');
        String MarketplaceDomain = '';
        String AWSAccessKeyId = 'MyAmazonAWSAccessKeyId';
        String AssociateTag = '';
        String XMLEscaping = '';
        String Validate = '';
        AmazonWS.ItemSearchRequest Shared = new AmazonWS.ItemSearchRequest();
        Shared.SearchIndex = 'DVD';
        AmazonWS.ItemSearchRequest[] Request = new AmazonWS.ItemSearchRequest[1];
        Request[0] = new AmazonWS.ItemSearchRequest();
        Request[0].Title = 'Inception';
        AmazonWS.ItemSearchResponse_element response = stub.ItemSearch(MarketplaceDomain,AWSAccessKeyId,AssociateTag,XMLEscaping,Validate,Shared,Request);
        AmazonWS.Items_element[] localItems = response.Items;
        System.Debug(localItems[0].TotalResults);
 }
 }

HTTPヘッダーをスタブに追加したのに、XMLリクエストメッセージで取得していません XMLリクエストは次のとおりです

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header />
<env:Body>
<ItemSearch xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
<MarketplaceDomain>
</MarketplaceDomain>
<AWSAccessKeyId>MyAWSAccessKeyId</AWSAccessKeyId>
<AssociateTag></AssociateTag>
<XMLEscaping></XMLEscaping>
<Validate></Validate>
<Shared><SearchIndex>DVD</SearchIndex></Shared>
<Request><Title>Inception</Title>
</Request></ItemSearch>
</env:Body></env:Envelope>

SOAP リクエストにはヘッダーがないため、Amazon サーバーからの署名を求める SOAP エラーが発生します。

ご覧のとおり、私は Salesforce Apex を初めて使用します。の手順に従いました

http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_web_services_wsdl2apex.htm#http_header_support

ヘッダーを設定します。

ヘッダーが追加されない理由について何か考えはありますか?

PS ヘッダーを手動で追加して SOAP UI で試したところ、適切な応答が得られました。

ありがとう :)

4

1 に答える 1

1

私はあなたが間違った機能を使用していると思います:)(質問は確かに混乱しています)。

SOAP (または通常は HTTP) 通信は、送信ヘッダーと実際のメッセージ (必要に応じてペイロード) で構成されます。ヘッダーは短いテキストであり、メッセージは多くの場合、巨大な XML です。

あなたのコードはHTTP ヘッダーを設定しています (Web 通信で認証、ブラウザーに関する情報の提供、優先言語、Cookie の設定、404 ページが見つからないなどの戻りステータス コードに使用されます)。ダミー」ですが、ウィキペディアの記事が少し多すぎることに気付きました。これはもっと簡単かもしれません:

そして、Amazon の Web サービスが望んでいるのは、<env:Header>...</env:Header>タグ内のいくつかのフィールドだけではないでしょうか? 生成された apex コードをチェックして、「Header」というサブクラスが存在することを確認してください (「Signature」などの変数名を検索することもできます。これは完全な推測になりますが、次のようなものを記述する必要があると思います。

AmazonWS.AWSECommerceServicePortUS stub = new AmazonWS.AWSECommerceServicePortUS();
AmazonWS.Header h = new AmazonWS.Header();
h.AWSAccessKeyId = 'MyAmazonAWSAccessKeyId';
h.Timestamp = '2012-11-28T12:11:30Z';
h.Signature = 'Encrypted Secret Code';
stub.Header = h; // plug it into the request

// create and plug other required tags
AmazonWS.ItemSearchRequest Shared = new AmazonWS.ItemSearchRequest();
Shared.SearchIndex = 'DVD';
AmazonWS.ItemSearchRequest[] Request = new AmazonWS.ItemSearchRequest[1];
Request[0] = new AmazonWS.ItemSearchRequest();
Request[0].Title = 'Inception';
// ...

さらに混乱させるために、HTTP ヘッダーを使用する必要があるかもしれません。SOAPActionという特別なヘッダーがあります。しかし、一般的に言えば、データを http ヘッダーではなく XML に配置した後だと思います。


面白いことに、私はhttp://aws.amazon.com/code/Product-Advertising-API/2478から Java の例をダウンロードしました。 XMLで。おそらく、それは REST GET メソッドだからです (その API にアクセスできれば、多くの手間を省くことができます。SOAP は扱いにくいです)。

于 2012-11-28T19:28:06.133 に答える