簡體   English   中英

Amazon Product Advertising API使用Java簽署了請求

[英]Amazon Product Advertising API signed request with Java

經過幾個小時的修補和多次閱讀整個互聯網,我無法弄清楚如何簽署使用Product Advertising 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並將自己請求簽名所需的所有部分放入其中。 但是沒有這樣的方法。

我希望有人可以指出我做錯了什么。


這就是我為解決問題所做的。 所有的功勞歸功於Jon和亞馬遜論壇的人。

在我概述我做了什么之前,這里有一個鏈接到這個帖子,它幫助我解決了這個問題: 亞馬遜論壇上的論壇帖子

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

最后的印刷品或多或少都沒用。 但它的確有效。 我還使用WSDL Jon鏈接來生成一個新的Web服務客戶端。 我剛剛在我的問題中發布的教程中更改了URL。

在創建服務后嘗試此操作

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY));

您將需要此類 jar文件作為AwsHandlerResolver使用Base64編碼的項目的引用添加。

您需要將AwsHandlerResolver文件重命名為類的名稱,因為文件名全為小寫。

我認為你擁有的其余代碼很好。

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

這個討論和相關的亞馬遜帖子幫助我讓客戶工作。 話雖如此,我覺得解決方案可以改進以下方面:

  1. 不鼓勵在代碼中設置WebService處理程序。 建議使用XML配置文件和相應的@HandlerChain注釋。
  2. 在這種情況下不需要SOAPHandler,LogicalHandler就可以了。 SOAPHandler具有比LogicalHandler更多的范圍,當涉及到代碼時,更多訪問並不總是好的。
  3. 填充簽名生成,添加節點並在一個處理程序中打印請求似乎有點太多了。 這些可以分離出來,以分離責任和便於測試。 一種方法是使用XSLT轉換添加節點,以便處理程序可以保持對轉換邏輯的遺忘。 然后可以鏈接另一個處理程序,它只打印請求。

我在春天這樣做,它工作正常。

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

您也可以使用IntentBrite API實現相同的貨幣化結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM