2010-07-06 11 views
16

po wielu godzinach majsterkowania i przeczytaniu całego internetu kilka razy po prostu nie mogę wymyślić, jak podpisać prośby o użycie z API Reklamy produktu.Zgłoszone przez Amazon Product Advertising API żądanie z Javą

Do tej pory udało mi się wygenerować klienta z podanego pliku WSDL. Skorzystałem z samouczka Amazona. Można go znaleźć tutaj:

Tutorial for generating the web service client

tej pory żadnych problemów. Aby przetestować klienta, napisałem mały fragment kodu. Kod ma na celu uzyskanie pewnych informacji o produkcie. Produkt jest określony przez jego ASIN.

Kod:

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

Jak widać nie ma części, gdzie mam podpisać wniosek. Przeszedłem przez wiele używanych klas i nie znalazłem żadnych metod podpisania wniosku.

Jak podpisać wniosek?

I rzeczywiście znaleźć coś w dokumentacji: request authentication

Ale oni nie używają własnego API. Proponowane rozwiązania są w mniejszym lub większym stopniu przeznaczone wyłącznie do użytku ręcznego. Popatrzyłem więc na klasy klientów, aby ustalić, czy mogę uzyskać adres URL żądania i umieścić wszystkie części potrzebne do samodzielnego podpisania wniosku. Ale nie ma takich metod.

Mam nadzieję, że ktoś może wskazać, co robię źle.


Oto, co zrobiłem, aby rozwiązać problem. Cały kredyt trafia do Jon i chłopaków z forów Amazon.

Zanim opiszę, co zrobiłem, oto link do wpisu, który pomógł mi rozwiązać problem: Forum Post on Amazon forums.

Pobrałem plik awshandlerresolver.java, który jest powiązany w poście. Niż ja zmodyfikowane mój własny kod tak wygląda to tak:

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 na koniec są mniej lub bardziej bezużyteczny. Ale działa. Użyłem również WSDL Jona połączonego, aby wygenerować nowego klienta usług sieciowych. Właśnie zmieniłem adresy URL w samouczku opublikowanym w moim pytaniu.

+1

dziękuję za opublikowanie tego podsumowania, właśnie uratował mnie około jeden dzień wysiłku! –

+0

Kolejna sprawa: [notatka o generowaniu API po stronie klienta] (http://docs.amazonwebservices.com/AWSECommerceService/latest/GSG/YourDevelopmentEnvironment.html) nie wyjaśnia, że ​​programista ** musi ** wprowadzić plik jaxws-custom.xml do wsimport lub przykłady takie jak Jens "nie skompilują się z wygenerowanym kodem. –

Odpowiedz

6

Spróbuj afer utworzyć usługę

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY)); 

Musisz this klasę i this pliku jar dodać jako odniesienie do projektu jako AwsHandlerResolver używa kodowania Base64.

Będziesz musiał zmienić nazwę pliku AwsHandlerResolver na nazwę klasy, ponieważ nazwa pliku jest cała małymi literami.

Myślę, że reszta kodu, który masz, jest w porządku.

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

+0

WSDL pochodzi z kwietnia 2010 r. Jest więc dość nowy. Czy używasz przykładowego kodu z google? Kiedyś znalazłem coś, co wyglądało bardzo podobnie do tego, co masz. Klient wygenerowany z dostarczonego przez Amazon WSDL nie zawierał klasy takiej jak AwsHandlerResolver. Ale i tak dziękuję za sugestie! – Jens

+0

Zaktualizowałem moją odpowiedź – Jon

+0

Twoja odpowiedź była wspaniała. Połączony post na forach Amazon bardzo mi pomógł! Zmieniłem mój post, aby uwzględnić twoją odpowiedź. Dziękuję bardzo Jon. – Jens

1

Ta dyskusja i związane Amazon po pomógł mi dostać klient działa.Mając na uwadze powyższe, czułem, że rozwiązaniem mogłoby być lepsze w odniesieniu do następujących:

  1. Ustawianie koparki WebService w kodzie nie jest zalecane. Zaleca się plik konfiguracyjny XML i odpowiednią adnotację @HandlerChain.
  2. Usługa SOAPHandler nie jest wymagana w tym przypadku, program LogicalHandler byłby w porządku. SOAPHandler ma większy zasięg niż LogicalHandler, a jeśli chodzi o kod, większy dostęp nie zawsze jest dobry.
  3. Wypełnienie generowania sygnatur, dodanie węzła i wydrukowanie żądania w jednym uchwycie wydaje się trochę za dużo. Można je oddzielić w celu oddzielenia odpowiedzialności i łatwości testowania. Jednym z podejść byłoby dodanie węzła przy użyciu transformacji XSLT, tak aby przewodnik mógł pozostać obojętny na logikę transformacji. Inny handler może być następnie połączony łańcuchem, który właśnie drukuje żądanie. Example
-3

Można osiągnąć takie same wyniki monetyzacji z API IntentBrite także

-2

Zrobiłem to na wiosnę, że wszystko działa prawidłowo.

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

Byłoby miło stwierdzić, co robi kod, zamiast tylko wklejać kod – Joel

Powiązane problemy