2010-07-06 5 views
16

nach vielen Stunden Basteln und Lesen des gesamten Internets mehrmals Ich kann einfach nicht herausfinden, wie Sie Anfragen für die Verwendung mit der Product Advertising API zu unterzeichnen.Amazon Product Advertising API signierte Anfrage mit Java

Bisher konnte ich aus der bereitgestellten WSDL-Datei einen Client generieren. Ich habe dafür ein Tutorial von Amazon benutzt. Sie können es hier finden:

Tutorial for generating the web service client

Bisher keine Probleme. Um den Client zu testen, habe ich einen kleinen Code geschrieben. Der Code soll nur einige Informationen über ein Produkt erhalten. Das Produkt wird von seinem ASIN angegeben.

Der Code:

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

Wie man dort sehen kann kein Teil ist, wo ich den Antrag unterschreiben. Ich habe mich durch viele der verwendeten Klassen durchgearbeitet und keine Methoden gefunden, um die Anfrage zu signieren.

Also, wie man eine Anfrage unterschreiben?

Ich fand tatsächlich etwas in der Dokumentation: request authentication

Aber sie haben keine eigene API verwenden. Die vorgeschlagenen Lösungen sind mehr oder weniger nur für den manuellen Gebrauch. Also habe ich in den Client-Klassen nachsortiert, um herauszufinden, ob ich die Anfrage-URL bekommen konnte und alle Teile, die für die Anfrage erforderlich sind, selbst einrichtete. Aber solche Methoden gibt es nicht.

Ich hoffe jemand kann darauf hinweisen, was ich falsch mache.


Dies ist, was ich getan habe, um das Problem zu lösen. Der ganze Kredit geht an Jon und die Jungs der Amazonas-Foren.

Bevor ich skizziere, was ich getan habe, hier ist ein Link zum Beitrag, der mir geholfen hat, das Problem zu lösen: Forum Post on Amazon forums.

Ich habe den awshandlerresolver.java heruntergeladen, der in der Post verlinkt ist. Als ich meinen eigenen Code modifiziert, so sieht es wie folgt aus:

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

Die println am Ende mehr oder weniger nutzlos. Aber es funktioniert. Ich habe auch die WSDL Jon verknüpft, um einen neuen Webservice-Client zu generieren. Ich habe gerade die URLs in dem Tutorial geändert, das ich in meiner Frage gepostet habe.

+1

danke für das Posten dieser Zusammenfassung, rettete mich gerade über einen Tagesaufwand! –

+0

eine andere Sache: die [clientseitigen API-Generierungshinweise] (http://docs.amazonwebservices.com/AWSECommerceService/latest/GSG/YourDevelopmentEnvironment.html) machen es nicht explizit, dass der Entwickler ** den ** eingeben muss jaxws-custom.xml-Datei zu wsimport, oder Beispiele wie Jens 'werden nicht mit dem erzeugten Code kompiliert. –

Antwort

6

Try this afer Sie den Dienst

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY)); 

Sie erstellen müssen this Klasse und this JAR-Datei als Verweis auf einem Projekt hinzuzufügen als AwsHandlerResolver Base64-Codierung verwendet.

Sie müssen die AwsHandlerResolver-Datei in den Namen der Klasse umbenennen, da der Dateiname aus Kleinbuchstaben besteht.

Ich denke, der Rest des Codes, den Sie haben, ist in Ordnung.

Die WSDL ist http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

+0

Die WSDL ist von April 2010. So ist es ziemlich neu. Verwenden Sie den Beispielcode von Google? Ich habe dort einmal etwas gefunden, das wirklich sehr ähnlich aussah wie das, was du hast. Der Client, der von der von Amazon bereitgestellten WSDL generiert wurde, enthielt keine Klasse wie AwsHandlerResolver. Aber danke für deine Vorschläge sowieso! – Jens

+0

Ich habe meine Antwort aktualisiert – Jon

+0

Ihre Antwort war großartig. Der verlinkte Beitrag in den Amazonforen hat mir sehr geholfen! Ich habe meinen Beitrag bearbeitet, um Ihre Antwort zu integrieren. Vielen Dank Jon. – Jens

1

Diese Diskussion und die damit verbundene Amazon Post half mir den Kunden bekommen arbeiten.Davon abgesehen, hatte ich das Gefühl, dass die Lösung in Bezug auf Folgendes verbessert werden könnte:

  1. Das Festlegen von WebService-Handlern in Code wird abgeraten. Eine XML-Konfigurationsdatei und eine entsprechende @HandlerChain-Annotation werden empfohlen.
  2. Ein SOAPHandler ist in diesem Fall nicht erforderlich, LogicalHandler würde gut funktionieren. Ein SOAPHandler hat mehr Reichweite als ein LogicalHandler, und wenn es um Code geht, ist mehr Zugriff nicht immer gut.
  3. Füllen der Signaturgenerierung, Hinzufügen eines Knotens und Drucken der Anforderung in einem Handler scheint ein wenig zu viel. Diese könnten getrennt werden, um die Verantwortung zu übernehmen und das Testen zu erleichtern. Ein Ansatz wäre, den Knoten unter Verwendung einer XSLT-Transformation hinzuzufügen, so dass der Handler die Transformationslogik nicht beachten könnte. Ein anderer Handler könnte dann verkettet werden, der nur die Anfrage ausgibt. Example
-3

Sie könnten die gleiche Monetisierung Ergebnisse mit der IntentBrite API erzielen, als auch

-2

Ich tat dies im Frühjahr es funktioniert gut.

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

Es wäre schön zu sagen, was der Code tut, anstatt nur den Code einzufügen – Joel

Verwandte Themen