代码之家  ›  专栏  ›  技术社区  ›  Jens

Amazon产品广告API用Java签名请求

  •  16
  • Jens  · 技术社区  · 14 年前

    经过几个小时的修补和阅读整个互联网好几次,我只是不知道如何签署请求使用产品广告API。

    到目前为止,我成功地从提供的WSDL文件生成了一个客户机。我用了亚马逊的教程。你可以在这里找到它:

    Tutorial for generating the web service client

    到目前为止没有问题。为了测试客户机,我编写了一小段代码。该代码旨在简单地获取有关产品的一些信息。产品由其ASIN指定。

    代码:

    package client;
    
    import com.ECS.client.jax.AWSECommerceService;
    import com.ECS.client.jax.AWSECommerceServicePortType;
    import com.ECS.client.jax.ItemLookup;
    import com.ECS.client.jax.ItemLookupResponse;
    import com.ECS.client.jax.ItemLookupRequest;
    
    public class Client {
    
      public static void main(String[] args) {
        System.out.println("API Test startet");
    
        AWSECommerceService service = new AWSECommerceService();
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();
    
        ItemLookupRequest itemLookup = new ItemLookupRequest();
        itemLookup.setIdType("ASIN");
        itemLookup.getItemId().add("B000RE216U");
    
        ItemLookup lookup = new ItemLookup();
        lookup.setAWSAccessKeyId("<mykeyishere>");
        lookup.getRequest().add(itemLookup);
    
        ItemLookupResponse response = port.itemLookup(lookup);
    
        String r = response.toString();
        System.out.println("response: " + r);
    
        System.out.println("API Test stopped");
      }
    }
    

    如你所见,我没有在请求上签字。我已经研究了很多使用的类,但没有找到签名请求的方法。

    那么,如何签署请求呢?

    request authentication


    这就是我解决问题的方法。所有的功劳都归于 Jon 还有亚马逊论坛的人。

    在我概述我所做的事情之前,这里有一个帮助我解决问题的帖子链接: Forum Post on Amazon forums

    我下载了awshandlerresolver.java,它在帖子中有链接。然后我修改了自己的代码,所以看起来像这样:

    package client;
    
    import com.ECS.client.jax.AWSECommerceService;
    import com.ECS.client.jax.AWSECommerceServicePortType;
    import com.ECS.client.jax.ItemLookup;
    import com.ECS.client.jax.ItemLookupResponse;
    import com.ECS.client.jax.ItemLookupRequest;
    
    public class Client {
    
      public static void main(String[] args) {
        System.out.println("API Test startet");
    
        AWSECommerceService service = new AWSECommerceService();
        service.setHandlerResolver(new AwsHandlerResolver("<Secret Key>"));  // important
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();
    
        ItemLookupRequest itemLookup = new ItemLookupRequest();
        itemLookup.setIdType("ASIN");
        itemLookup.getItemId().add("B000RE216U");
    
        ItemLookup lookup = new ItemLookup();
        lookup.setAWSAccessKeyId("<Access Key>"); // important
        lookup.getRequest().add(itemLookup);
    
        ItemLookupResponse response = port.itemLookup(lookup);
    
        String r = response.toString();
        System.out.println("response: " + r);   
        System.out.println("API Test stopped");
      }
    }
    

    最后的印刷品多少是没用的。但它是有效的。我还使用WSDL Jon linked生成了一个新的webservice客户机。我只是改变了我在我的问题发布的教程的网址。

    4 回复  |  直到 7 年前
        1
  •  6
  •   Jon    14 年前

    创建服务后请尝试此操作

    service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY));
    

    你需要 this 类和 this

    您需要将AwsHandlerResolver文件重命名为类的名称,因为文件名都是小写的。

    WSDL是 http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

        2
  •  1
  •   Abhijit Sarkar    12 年前

    这个讨论和相关的亚马逊帖子帮助我让客户工作。尽管如此,我认为解决办法可以在以下方面加以改进:

    1. 不鼓励在代码中设置WebService处理程序。建议使用XML配置文件和相应的@HandlerChain注释。
    2. 在这种情况下不需要SOAPHandler,LogicalHandler就可以了。SOAPHandler比LogicalHandler有更多的访问权限,当涉及到代码时,更多的访问权限并不总是好的。
    3. Example
        3
  •  -2
  •   Luís Cruz    9 年前

    我在春天做的,效果很好。

    package com.bookbub.application;
    
    
    import com.ECS.client.jax.*;
    import com.ECS.client.jax.ItemSearch;
    
    import javax.xml.ws.Holder;
    import java.math.BigInteger;
    import java.util.List;
    
    public class TestClient {
    
    private static final String AWS_ACCESS_KEY_ID = "AI*****2Y7Z****DIHQ";
    private static final String AWS_SECRET_KEY = "lIm*****dJuiy***YA+g/vnj/Ix*****Oeu";
    private static final String ASSOCIATE_TAG = "****-**";
    
    public static void main(String[] args) {
        TestClient ist = new TestClient();
        ist.runSearch();
    }
    
    public void runSearch()
    {
        AWSECommerceService service = new AWSECommerceService();
        service.setHandlerResolver(new AwsHandlerResolver(AWS_SECRET_KEY));
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();
    
        ItemSearchRequest request = new ItemSearchRequest();
        request.setSearchIndex("Books");
        request.setKeywords("java web services up and running oreilly");
    
        ItemSearch search = new ItemSearch();
        search.getRequest().add(request);
        search.setAWSAccessKeyId(AWS_ACCESS_KEY_ID);
    
        Holder<OperationRequest> operation_request =null;
        Holder<List<Items>> items = new Holder<List<Items>>();
    
        port.itemSearch(
                search.getMarketplaceDomain(),
                search.getAWSAccessKeyId(),
                search.getAssociateTag(),
                search.getXMLEscaping(),
                search.getValidate(),
                search.getShared(),
                search.getRequest(),
                operation_request,
                items);
    
        java.util.List<Items> result = items.value;
        BigInteger totalPages = result.get(0).getTotalResults();
        System.out.println(totalPages);
    
        for (int i = 0; i < result.get(0).getItem().size(); ++i)
        {   Item myItem = result.get(0).getItem().get(i);
            System.out.print(myItem.getASIN());
            System.out.print(", ");
            System.out.println(myItem.getDetailPageURL());
            System.out.print(", ");
            System.out.println(myItem.getSmallImage() == null ? "" : myItem.getSmallImage().getURL());
        }
    }
    }
    
        4
  •  -3
  •   Marius    11 年前

    您也可以使用intentbriteapi实现相同的货币化结果