经过几个小时的修补和阅读整个互联网几次,我只是不能弄清楚如何签署使用产品广告API的请求。
到目前为止,我设法从提供的WSDL文件生成了一个客户端。我使用了Amazon的教程。您可以在这里找到它:
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.
我下载了文章中链接的www.example.com,然后修改了我自己的代码,看起来像这样:awshandlerresolver.java which is linked in the post. Than I modified my own code so it looks like this:
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。
4条答案
按热度按时间6za6bjd01#
请在创建服务后尝试此操作
由于AwsHandlerResolver使用Base64编码,因此您需要添加this类和this jar文件作为项目的引用。
您需要将AwsHandlerResolver文件重命名为类的名称,因为文件名全部是小写。
我觉得你剩下的代码没问题。
WSDL为http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl
tkclm6bt2#
这次讨论和相关的亚马逊帖子帮助我让客户工作起来。话虽如此,我觉得解决方案可以在以下方面改进:
1.不建议在代码中设置WebService处理程序。建议使用XML配置文件和相应的@HandlerChain注解。
1.在这种情况下不需要SOAPHandler,LogicalHandler就可以了。SOAPHandler比LogicalHandler有更多的访问权限,当涉及到代码时,更多的访问权限并不总是好的。
1.在一个处理程序中填充签名生成、添加节点和打印请求似乎有点太多了。为了职责分离和便于测试,可以将这些操作分开。一种方法是使用XSLT转换添加节点,这样处理程序就可以忽略转换逻辑。然后可以链接另一个处理程序,只打印请求。Example
wgxvkvu93#
我在Spring做的,现在很好。
vxbzzdmp4#
您也可以使用IntentBrite API实现相同的盈利结果