通过Java/SOAP的Amazon产品广告API

通过Java/SOAP的Amazon产品广告API,java,soap,jax-ws,amazon,amazon-product-api,Java,Soap,Jax Ws,Amazon,Amazon Product Api,我一直在玩亚马逊的产品广告API,我无法得到一个请求,通过它给我数据。我一直在研究这个:还有这个: 这是我的密码。。我使用以下方法生成SOAP绑定: 在类路径上,我只有: 我做错了什么(注意第二个for循环中没有打印“item”,因为它是空的)?如何对此进行故障排除或获取相关错误信息?响应对象似乎没有覆盖toString(),因此如果它包含某种错误响应,只需打印它就不会告诉您错误响应是什么。您需要查看api以了解响应对象中返回的字段,并单独打印这些字段。您可能会收到一条明显的错误消息,或者您必须

我一直在玩亚马逊的产品广告API,我无法得到一个请求,通过它给我数据。我一直在研究这个:还有这个:

这是我的密码。。我使用以下方法生成SOAP绑定:

在类路径上,我只有:


我做错了什么(注意第二个for循环中没有打印“item”,因为它是空的)?如何对此进行故障排除或获取相关错误信息?

响应对象似乎没有覆盖toString(),因此如果它包含某种错误响应,只需打印它就不会告诉您错误响应是什么。您需要查看api以了解响应对象中返回的字段,并单独打印这些字段。您可能会收到一条明显的错误消息,或者您必须返回他们的文档,试图找出错误所在。

您需要调用Item对象上的get方法来检索其详细信息,例如:

for (Item item : itemList.getItem()) {
   System.out.println(item.getItemAttributes().getTitle()); //Title of item
   System.out.println(item.getDetailPageURL()); // Amazon URL
   //etc
}
如果有任何错误,可以通过调用getErrors()来获取它们


我没有使用SOAP API,但是您的赏金要求没有说明它必须使用SOAP,只是您想调用Amazon并获得结果。因此,我将使用REST API发布这个工作示例,它至少可以满足您所述的要求:

我想要一些工作的例子代码,点击亚马逊服务器并返回结果

您需要下载以下内容以满足签名要求:

解压缩它,抓取
com.amazon.advisting.api.sample.SignedRequestsHelper.java
文件,并将其直接放入项目中。此代码用于对请求进行签名

您还需要从下面下载ApacheCommonsCodec1.3,并将其添加到您的类路径,即添加到项目的库中。请注意,这是唯一一个可用于上述类的编解码器版本(
SignedRequestsHelper

现在,您可以复制并粘贴以下内容,确保用正确的包名替换
your.pkg.here
,并替换
SECRET
KEY
属性:

package your.pkg.here;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Main {

    private static final String SECRET_KEY = "<YOUR_SECRET_KEY>";
    private static final String AWS_KEY = "<YOUR_KEY>";

    public static void main(String[] args) {
        SignedRequestsHelper helper = SignedRequestsHelper.getInstance("ecs.amazonaws.com", AWS_KEY, SECRET_KEY);

        Map<String, String> params = new HashMap<String, String>();
        params.put("Service", "AWSECommerceService");
        params.put("Version", "2009-03-31");
        params.put("Operation", "ItemLookup");
        params.put("ItemId", "1451648537");
        params.put("ResponseGroup", "Large");

        String url = helper.sign(params);
        try {
            Document response = getResponse(url);
            printResponse(response);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static Document getResponse(String url) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(url);
        return doc;
    }

    private static void printResponse(Document doc) throws TransformerException, FileNotFoundException {
        Transformer trans = TransformerFactory.newInstance().newTransformer();
        Properties props = new Properties();
        props.put(OutputKeys.INDENT, "yes");
        trans.setOutputProperties(props);
        StreamResult res = new StreamResult(new StringWriter());
        DOMSource src = new DOMSource(doc);
        trans.transform(src, res);
        String toString = res.getWriter().toString();
        System.out.println(toString);
    }
}
将您的.pkg.here打包;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.io.StringWriter;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Properties;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.OutputKeys;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.xml.sax.SAXException;
公共班机{
私有静态最终字符串SECRET_KEY=“”;
私有静态最终字符串AWS_KEY=“”;
公共静态void main(字符串[]args){
SignedRequestsHelper helper=SignedRequestsHelper.getInstance(“ecs.amazonaws.com”,AWS_KEY,SECRET_KEY);
Map params=新的HashMap();
参数put(“服务”、“AWSECommerceService”);
参数put(“版本”,“2009-03-31”);
参数put(“操作”、“项查找”);
参数put(“项目ID”、“1451648537”);
参数put(“响应组”、“大”);
字符串url=helper.sign(参数);
试一试{
文档响应=getResponse(url);
打印应答(应答);
}捕获(例外情况除外){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex);
}
}
私有静态文档getResponse(字符串url)抛出ParserConfiguration异常、IOException、SAXException{
DocumentBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
文档doc=builder.parse(url);
退货单;
}
私有静态void打印响应(文档文档)引发TransformerException、FileNotFoundException{
Transformer trans=TransformerFactory.newInstance().newTransformer();
Properties props=新属性();
props.put(OutputKeys.INDENT,“是”);
trans.setOutputProperties(道具);
StreamResult res=newstreamresult(newstringwriter());
DOMSource src=新的DOMSource(doc);
变换(src,res);
字符串toString=res.getWriter().toString();
System.out.println(toString);
}
}
如您所见,这比SOAP API的设置和使用要简单得多。如果您对使用SOAP API没有特定要求,那么我强烈建议您改用REST API

使用RESTAPI的一个缺点是,结果不会为您解组到对象中。这可以通过基于wsdl创建所需的类来解决。

这最终起作用(我必须将我的associateTag添加到请求中):

公共类客户端{
公共静态void main(字符串[]args){
字符串secretKey=“”;
字符串awsKey=“”;
System.out.println(“API测试已启动”);
AWSECommerceService service=新的AWSECommerceService();
service.setHandlerResolver(新的AwsHandlerResolver(secretKey));//重要
AWSECommerceServicePortType端口=服务。getAWSECommerceServicePort();
//获取操作对象:
com.ECS.client.jax.ItemSearchRequest itemRequest=new com.ECS.client.jax.ItemSearchRequest();
//填写请求对象:
itemRequest.setSearchIndex(“账簿”);
itemRequest.setKeywords(“星球大战”);
itemRequest.getResponseGroup().add(“大”);
//itemRequest.getResponseGroup().add(“图像”);
//itemRequest.setVersion(“2011-08-01”);
com.ECS.client.jax.ItemSearch itemlelement=new com.ECS.client.jax.ItemSearch();
for (Item item : itemList.getItem()) {
   System.out.println(item.getItemAttributes().getTitle()); //Title of item
   System.out.println(item.getDetailPageURL()); // Amazon URL
   //etc
}
if (response.getOperationRequest().getErrors() != null) { 
  System.out.println(response.getOperationRequest().getErrors().getError().get(0).getMessage());
}
package your.pkg.here;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Main {

    private static final String SECRET_KEY = "<YOUR_SECRET_KEY>";
    private static final String AWS_KEY = "<YOUR_KEY>";

    public static void main(String[] args) {
        SignedRequestsHelper helper = SignedRequestsHelper.getInstance("ecs.amazonaws.com", AWS_KEY, SECRET_KEY);

        Map<String, String> params = new HashMap<String, String>();
        params.put("Service", "AWSECommerceService");
        params.put("Version", "2009-03-31");
        params.put("Operation", "ItemLookup");
        params.put("ItemId", "1451648537");
        params.put("ResponseGroup", "Large");

        String url = helper.sign(params);
        try {
            Document response = getResponse(url);
            printResponse(response);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static Document getResponse(String url) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(url);
        return doc;
    }

    private static void printResponse(Document doc) throws TransformerException, FileNotFoundException {
        Transformer trans = TransformerFactory.newInstance().newTransformer();
        Properties props = new Properties();
        props.put(OutputKeys.INDENT, "yes");
        trans.setOutputProperties(props);
        StreamResult res = new StreamResult(new StringWriter());
        DOMSource src = new DOMSource(doc);
        trans.transform(src, res);
        String toString = res.getWriter().toString();
        System.out.println(toString);
    }
}
public class Client {

    public static void main(String[] args) {

        String secretKey = "<MY_SECRET_KEY>";
        String awsKey = "<MY AWS KEY>";

        System.out.println("API Test started");


        AWSECommerceService service = new AWSECommerceService();
        service.setHandlerResolver(new AwsHandlerResolver(secretKey)); // important
        AWSECommerceServicePortType port = service.getAWSECommerceServicePort();

        // Get the operation object:
        com.ECS.client.jax.ItemSearchRequest itemRequest = new com.ECS.client.jax.ItemSearchRequest();

        // Fill in the request object:
        itemRequest.setSearchIndex("Books");
        itemRequest.setKeywords("Star Wars");
        itemRequest.getResponseGroup().add("Large");
//      itemRequest.getResponseGroup().add("Images");
        // itemRequest.setVersion("2011-08-01");
        com.ECS.client.jax.ItemSearch ItemElement = new com.ECS.client.jax.ItemSearch();
        ItemElement.setAWSAccessKeyId(awsKey);
        ItemElement.setAssociateTag("th0426-20");
        ItemElement.getRequest().add(itemRequest);

        // Call the Web service operation and store the response
        // in the response object:
        com.ECS.client.jax.ItemSearchResponse response = port
                .itemSearch(ItemElement);

        String r = response.toString();
        System.out.println("response: " + r);

        for (Items itemList : response.getItems()) {
            System.out.println(itemList);

            for (Item itemObj : itemList.getItem()) {

                System.out.println(itemObj.getItemAttributes().getTitle()); // Title
                System.out.println(itemObj.getDetailPageURL()); // Amazon URL
            }
        }

        System.out.println("API Test stopped");

    }
}