亚马逊产品广告API使用Java签署请求

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (297)

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

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

生成Web服务客户端的教程

到目前为止没有问题。为了测试客户端,我写了一小段代码。该代码旨在简单地获取有关产品的一些信息。该产品由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");
  }
}

正如你所看到的,我没有签署请求的地方。我已经在很多使用的类中工作过,并且没有找到签名请求的方法。

那么,如何签署请求?

我实际上在文档中找到了一些内容:请求认证

但他们不使用他们自己的API。建议的解决方案或多或少仅供手动使用。因此,我查看了客户端类,以了解我是否可以获取请求URL,并将请求签名所需的所有部分放入自己。但是没有这样的方法。

我下载了在帖子中链接的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");
  }
}

最后的println或多或少是无用的。但它的工作。我还使用WSDL Jon链接来生成新的Web服务客户端。我刚刚在我的问题中发布的教程中更改了网址。

提问于
用户回答回答于

试一试你创建服务

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY));

由于AwsHandlerResolver使用Base64编码,因此需要此类和此 jar文件作为参考添加到项目中。

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

我认为你所拥有的其他代码是很好的。

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

用户回答回答于

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

  1. 不鼓励在代码中设置WebService处理程序。建议使用XML配置文件和相应的@HandlerChain注释。
  2. 在这种情况下,SOAPHandler不是必需的,LogicalHandler可以做得很好。SOAPHandler比LogicalHandler的覆盖范围更广,涉及到代码时,更多的访问并不总是好的。
  3. 填充签名生成,添加一个节点并在一个处理程序中打印请求似乎有点太多。这些可以被分离出来以分离责任和便于测试。一种方法是使用XSLT转换添加节点,以便处理程序可以保持对转换逻辑的忽略。然后可以链接另一个处理程序,只打印请求。

扫码关注云+社区