Web Services 使用Java签署的Amazon产品广告API请求

ghhaqwfi  于 2023-02-16  发布在  Java
关注(0)|答案(4)|浏览(190)

经过几个小时的修补和阅读整个互联网几次,我只是不能弄清楚如何签署使用产品广告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。

6za6bjd0

6za6bjd01#

请在创建服务后尝试此操作

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY));

由于AwsHandlerResolver使用Base64编码,因此您需要添加this类和this jar文件作为项目的引用。
您需要将AwsHandlerResolver文件重命名为类的名称,因为文件名全部是小写。
我觉得你剩下的代码没问题。
WSDL为http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

tkclm6bt

tkclm6bt2#

这次讨论和相关的亚马逊帖子帮助我让客户工作起来。话虽如此,我觉得解决方案可以在以下方面改进:
1.不建议在代码中设置WebService处理程序。建议使用XML配置文件和相应的@HandlerChain注解。
1.在这种情况下不需要SOAPHandler,LogicalHandler就可以了。SOAPHandler比LogicalHandler有更多的访问权限,当涉及到代码时,更多的访问权限并不总是好的。
1.在一个处理程序中填充签名生成、添加节点和打印请求似乎有点太多了。为了职责分离和便于测试,可以将这些操作分开。一种方法是使用XSLT转换添加节点,这样处理程序就可以忽略转换逻辑。然后可以链接另一个处理程序,只打印请求。Example

wgxvkvu9

wgxvkvu93#

我在Spring做的,现在很好。

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());
    }
}
}
vxbzzdmp

vxbzzdmp4#

您也可以使用IntentBrite API实现相同的盈利结果

相关问题