[英]Amazon Product Advertising API signed request with Java
經過幾個小時的修補和多次閱讀整個互聯網,我無法弄清楚如何簽署使用Product Advertising API的請求。
到目前為止,我設法從提供的WSDL文件生成客戶端。 我使用了亞馬遜的教程。 你可以在這里找到它:
到目前為止沒有問題。 為了測試客戶端,我寫了一小段代碼。 該代碼旨在簡單地獲取有關產品的一些信息。 該產品由其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
這個討論和相關的亞馬遜帖子幫助我讓客戶工作。 話雖如此,我覺得解決方案可以改進以下方面:
我在春天這樣做,它工作正常。
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.