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.
dziękuję za opublikowanie tego podsumowania, właśnie uratował mnie około jeden dzień wysiłku! –
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. –