8

私は Amazon の Product Advertising API をいじっていますが、リクエストを通過してデータを提供することができません。私はこれに取り組んでいます: http://docs.amazonwebservices.com/AWSECommerceService/2011-08-01/GSG/そしてこれ: Amazon Product Advertising API signed request with Java

これが私のコードです..これを使用してSOAPバインディングを生成しました: http://docs.amazonwebservices.com/AWSECommerceService/2011-08-01/GSG/YourDevelopmentEnvironment.html#Java

クラスパスには、 commons-codec.1.5.jarしかありません。

import com.ECS.client.jax.AWSECommerceService;
import com.ECS.client.jax.AWSECommerceServicePortType;
import com.ECS.client.jax.Item;
import com.ECS.client.jax.ItemLookup;
import com.ECS.client.jax.ItemLookupRequest;
import com.ECS.client.jax.ItemLookupResponse;
import com.ECS.client.jax.ItemSearchResponse;
import com.ECS.client.jax.Items;

public class Client {

    public static void main(String[] args) {

        String secretKey = <my-secret-key>;
        String awsKey = <my-aws-key>;

        System.out.println("API Test started");

        AWSECommerceService service = new AWSECommerceService();
        service.setHandlerResolver(new AwsHandlerResolver(
                secretKey)); // important
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();

        // Get the operation object:
        com.ECS.client.jax.ItemSearchRequest itemRequest = new com.ECS.client.jax.ItemSearchRequest();

        // Fill in the request object:
        itemRequest.setSearchIndex("Books");
        itemRequest.setKeywords("Star Wars");
        // itemRequest.setVersion("2011-08-01");
        com.ECS.client.jax.ItemSearch ItemElement = new com.ECS.client.jax.ItemSearch();
        ItemElement.setAWSAccessKeyId(awsKey);
        ItemElement.getRequest().add(itemRequest);

        // Call the Web service operation and store the response
        // in the response object:
        com.ECS.client.jax.ItemSearchResponse response = port
                .itemSearch(ItemElement);

        String r = response.toString();
        System.out.println("response: " + r);

        for (Items itemList : response.getItems()) {
            System.out.println(itemList);
            for (Item item : itemList.getItem()) {
                System.out.println(item);
            }
        }

        System.out.println("API Test stopped");

    }
}

これが私が戻ってきたものです.. Amazonで入手可能なスターウォーズの本が私のコンソールに捨てられるのを見たいと思っていました:-/:

API Test started
response: com.ECS.client.jax.ItemSearchResponse@7a6769ea
com.ECS.client.jax.Items@1b5ac06e
API Test stopped

私は何を間違っていますか (2番目のforループの「アイテム」は空であるため、出力されていないことに注意してください)? これをトラブルシューティングしたり、関連するエラー情報を取得するにはどうすればよいですか?

4

4 に答える 4

10

私は SOAP API を使用していませんが、Bounty の要件には、Amazon に電話して結果を取得するために SOAP のみを使用する必要があるとは記載されていませんでした。したがって、少なくとも指定された要件を満たす REST API を使用して、この実用的な例を投稿します。

Amazonサーバーにアクセスして結果を返す実際のサンプルコードが欲しい

署名要件を満たすには、次のものをダウンロードする必要があります。

http://associates-amazon.s3.amazonaws.com/signed-requests/samples/amazon-product-advt-api-sample-java-query.zip

解凍してファイルを取得com.amazon.advertising.api.sample.SignedRequestsHelper.javaし、プロジェクトに直接配置します。このコードは、リクエストに署名するために使用されます。

また、次から Apache Commons Codec 1.3 をダウンロードして、クラスパスに追加する必要があります。つまり、プロジェクトのライブラリに追加します。これは、上記のクラスで動作するコーデックの唯一のバージョンであることに注意してください ( SignedRequestsHelper)

http://archive.apache.org/dist/commons/codec/binaries/commons-codec-1.3.zip

これで、次をコピーして貼り付けyour.pkg.here、適切なパッケージ名に置き換え、SECRETおよびKEYプロパティを置き換えることができます。

package your.pkg.here;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Main {

    private static final String SECRET_KEY = "<YOUR_SECRET_KEY>";
    private static final String AWS_KEY = "<YOUR_KEY>";

    public static void main(String[] args) {
        SignedRequestsHelper helper = SignedRequestsHelper.getInstance("ecs.amazonaws.com", AWS_KEY, SECRET_KEY);

        Map<String, String> params = new HashMap<String, String>();
        params.put("Service", "AWSECommerceService");
        params.put("Version", "2009-03-31");
        params.put("Operation", "ItemLookup");
        params.put("ItemId", "1451648537");
        params.put("ResponseGroup", "Large");

        String url = helper.sign(params);
        try {
            Document response = getResponse(url);
            printResponse(response);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static Document getResponse(String url) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(url);
        return doc;
    }

    private static void printResponse(Document doc) throws TransformerException, FileNotFoundException {
        Transformer trans = TransformerFactory.newInstance().newTransformer();
        Properties props = new Properties();
        props.put(OutputKeys.INDENT, "yes");
        trans.setOutputProperties(props);
        StreamResult res = new StreamResult(new StringWriter());
        DOMSource src = new DOMSource(doc);
        trans.transform(src, res);
        String toString = res.getWriter().toString();
        System.out.println(toString);
    }
}

ご覧のとおり、これは SOAP API よりもセットアップと使用がはるかに簡単です。SOAP API を使用するための特定の要件がない場合は、代わりに REST API を使用することを強くお勧めします。

REST API を使用することの欠点の 1 つは、結果がオブジェクトにアンマーシャリングされないことです。これは、wsdl に基づいて必要なクラスを作成することで解決できます。

于 2011-12-03T21:09:45.083 に答える
4

これはうまくいきました(私は自分の AssociateTag をリクエストに追加しなければなりませんでした):

public class Client {

    public static void main(String[] args) {

        String secretKey = "<MY_SECRET_KEY>";
        String awsKey = "<MY AWS KEY>";

        System.out.println("API Test started");


        AWSECommerceService service = new AWSECommerceService();
        service.setHandlerResolver(new AwsHandlerResolver(secretKey)); // important
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();

        // Get the operation object:
        com.ECS.client.jax.ItemSearchRequest itemRequest = new com.ECS.client.jax.ItemSearchRequest();

        // Fill in the request object:
        itemRequest.setSearchIndex("Books");
        itemRequest.setKeywords("Star Wars");
        itemRequest.getResponseGroup().add("Large");
//      itemRequest.getResponseGroup().add("Images");
        // itemRequest.setVersion("2011-08-01");
        com.ECS.client.jax.ItemSearch ItemElement = new com.ECS.client.jax.ItemSearch();
        ItemElement.setAWSAccessKeyId(awsKey);
        ItemElement.setAssociateTag("th0426-20");
        ItemElement.getRequest().add(itemRequest);

        // Call the Web service operation and store the response
        // in the response object:
        com.ECS.client.jax.ItemSearchResponse response = port
                .itemSearch(ItemElement);

        String r = response.toString();
        System.out.println("response: " + r);

        for (Items itemList : response.getItems()) {
            System.out.println(itemList);

            for (Item itemObj : itemList.getItem()) {

                System.out.println(itemObj.getItemAttributes().getTitle()); // Title
                System.out.println(itemObj.getDetailPageURL()); // Amazon URL
            }
        }

        System.out.println("API Test stopped");

    }
}
于 2011-12-05T00:54:10.760 に答える
1

詳細を取得するには、Item オブジェクトの get メソッドを呼び出す必要があります。次に例を示します。

for (Item item : itemList.getItem()) {
   System.out.println(item.getItemAttributes().getTitle()); //Title of item
   System.out.println(item.getDetailPageURL()); // Amazon URL
   //etc
}

エラーがある場合は、getErrors() を呼び出してエラーを取得できます。

if (response.getOperationRequest().getErrors() != null) { 
  System.out.println(response.getOperationRequest().getErrors().getError().get(0).getMessage());
}
于 2011-12-01T17:16:51.213 に答える
1

応答オブジェクトは toString() をオーバーライドしていないように見えるため、何らかのエラー応答が含まれている場合、単純に出力してもエラー応答が何であるかはわかりません。応答オブジェクトで返されるフィールドについて API を調べ、それらを個別に出力する必要があります。明らかなエラー メッセージが表示されるか、ドキュメントに戻って何が問題なのかを突き止める必要があります。

于 2011-12-01T04:36:45.753 に答える