【发布时间】:2011-03-12 12:35:01
【问题描述】:
经过数小时的修补和多次阅读整个互联网后,我只是不知道如何签署使用产品广告 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
但他们不使用自己的 API。建议的解决方案或多或少仅用于手动使用。因此,我查看了客户端类,以确定是否可以获取请求 URL,并将请求登录所需的所有部分放入我自己。但是没有这样的方法。
我希望有人能指出我做错了什么。
这就是我为解决问题所做的。所有功劳归于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");
}
}
最后的 println 或多或少没用。但它有效。我还使用链接的 WSDL Jon 来生成一个新的 web 服务客户端。我刚刚更改了我在问题中发布的教程中的 URL。
【问题讨论】:
-
感谢您发布此摘要,为我节省了一天的精力!
-
另一件事:client-side API generation notes 并没有明确指出开发人员必须将 jaxws-custom.xml 文件输入到 wsimport 或 Jens 的示例'不使用它生成的代码进行编译。
标签: java web-services api amazon-web-services amazon