2010-07-06 8 views
16

के साथ अनुरोध किया है कि पूरे इंटरनेट को कई बार टंकण और पढ़ने के बाद कई बार मैं उत्पाद विज्ञापन API के उपयोग के लिए अनुरोधों पर हस्ताक्षर कैसे कर सकता हूं।अमेज़ॅन उत्पाद विज्ञापन एपीआई ने जावा

अब तक मैं प्रदान की गई WSDL फ़ाइल से क्लाइंट उत्पन्न करने में कामयाब रहा। मैंने इसके लिए अमेज़ॅन द्वारा एक ट्यूटोरियल का इस्तेमाल किया। अब तक कोई समस्या नहीं

Tutorial for generating the web service client

: आप इसे यहाँ पा सकते हैं। क्लाइंट का परीक्षण करने के लिए मैंने कोड का एक छोटा टुकड़ा लिखा था। कोड का उद्देश्य किसी उत्पाद के बारे में कुछ जानकारी प्राप्त करना है। उत्पाद अपने एएसआईएन द्वारा निर्दिष्ट किया गया है।

कोड:

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

आप देख सकते हैं कि वहाँ कोई हिस्सा है जहाँ मैं अनुरोध पर हस्ताक्षर है। मैंने उपयोग की जाने वाली कई कक्षाओं के माध्यम से अपना रास्ता काम किया है और अनुरोध पर हस्ताक्षर करने के लिए कोई तरीका नहीं मिला है।

तो, अनुरोध पर हस्ताक्षर कैसे करें?

मैं वास्तव में दस्तावेज में कुछ पाया: request authentication

लेकिन वे अपने स्वयं के एपीआई का उपयोग नहीं करते। प्रस्तावित समाधान मैन्युअल उपयोग के लिए केवल कम या कम हैं। इसलिए मैंने क्लाइंट क्लास में यह पता लगाने के लिए देखा कि क्या मैं अनुरोध यूआरएल प्राप्त कर सकता हूं और खुद को साइन इन करने के अनुरोध के लिए आवश्यक सभी हिस्सों को रख सकता हूं। लेकिन ऐसी कोई विधि नहीं है।

मुझे उम्मीद है कि कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं।


यही समस्या मैंने हल करने के लिए किया था। सभी क्रेडिट Jon और अमेज़ॅन मंचों के लोग जाते हैं।

इससे पहले कि मैंने जो कुछ किया है, उसकी रूपरेखा से पहले, यहां पोस्ट का एक लिंक है जिसने मुझे समस्या को हल करने में मदद की: Forum Post on Amazon forums

मैंने पोस्ट में जुड़ा हुआ 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"); 
    } 
} 

अंत में प्रिंटलन कम या ज्यादा बेकार है। लेकिन यह काम करता है। मैंने डब्ल्यूएसडीएल जॉन का भी एक नया webservice क्लाइंट उत्पन्न करने के लिए लिंक किया। मैंने अपने प्रश्न में पोस्ट किए गए ट्यूटोरियल में यूआरएल को बदल दिया है।

+1

इस सारांश को पोस्ट करने के लिए धन्यवाद, बस मुझे एक दिन के प्रयास के बारे में बचाया! –

+0

एक और बात: [क्लाइंट-साइड एपीआई पीढ़ी नोट्स] (http://docs.amazonwebservices.com/AWSECommerceService/latest/GSG/YourDevelopmentEnvironment.html) यह स्पष्ट नहीं करते कि डेवलपर ** ** इनपुट करना चाहिए waximport करने के लिए jaxws-custom.xml फ़ाइल, या जेन्स 'जैसे उदाहरण जेनरेट किए गए कोड से संकलित नहीं होंगे। –

उत्तर

6

इस प्रयास करें afer आप सेवा

service.setHandlerResolver(new AwsHandlerResolver(my_AWS_SECRET_KEY)); 

बनाते हैं तो आप के रूप में AwsHandlerResolver Base64 एन्कोडिंग का उपयोग करता अपनी परियोजना के लिए एक संदर्भ के रूप में जोड़ने के लिए this वर्ग और this जार फ़ाइल की आवश्यकता होगी।

आपको कक्षा के नाम पर AwsHandlerResolver फ़ाइल का नाम बदलने की आवश्यकता होगी क्योंकि फ़ाइल का नाम सभी कम मामला है।

मुझे लगता है कि आपके पास शेष कोड ठीक है।

डबल्यूएसडीएल http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

+0

डब्लूएसडीएल अप्रैल 2010 से है। तो यह काफी नया है। क्या आप Google से नमूना कोड का उपयोग करते हैं? मैंने एक बार वहां कुछ पाया जो वास्तव में आपके जैसा है। अमेज़ॅन द्वारा उत्पन्न क्लाइंट ने डब्ल्यूएसडीएल में AwsHandlerResolver जैसी कक्षा शामिल नहीं की थी। लेकिन वैसे भी आपके सुझावों के लिए धन्यवाद! – Jens

+0

मैंने अपना उत्तर – Jon

+0

अपडेट किया है आपका उत्तर बहुत अच्छा था। अमेज़ॅन मंचों पर जुड़ी पोस्ट ने मुझे बहुत मदद की! मैंने अपना उत्तर आपके उत्तर को शामिल करने के लिए संपादित किया। बहुत बहुत धन्यवाद जॉन। – Jens

1

इस चर्चा है और संबंधित अमेज़न पोस्ट मुझे ग्राहक काम कर पाने में मदद की।ऐसा कहा जा रहा है, मुझे लगा कि समाधान निम्नलिखित के संबंध में सुधार किया जा सकता है:

  1. कोड में वेब सेवा हैंडलर को सेट करना निराश है। एक एक्सएमएल कॉन्फ़िगरेशन फ़ाइल और संबंधित @ हैंडलर चेन एनोटेशन की अनुशंसा की जाती है।
  2. इस मामले में एक SOAPHandler की आवश्यकता नहीं है, लॉजिकल हैंडलर ठीक काम करेगा। एक SOAPHandler के पास लॉजिकल हैंडलर की तुलना में अधिक पहुंच है और जब कोड की बात आती है, तो अधिक पहुंच हमेशा अच्छी नहीं होती है।
  3. हस्ताक्षर पीढ़ी को भरना, नोड के अतिरिक्त और एक हैंडलर में अनुरोध प्रिंट करना थोड़ा अधिक लगता है। जिम्मेदारी को अलग करने और परीक्षण में आसानी के लिए इन्हें अलग किया जा सकता है। एक दृष्टिकोण एक्सएसएलटी परिवर्तन का उपयोग करके नोड को जोड़ना होगा ताकि हैंडलर परिवर्तन तर्क से अनजान रह सके। एक और हैंडलर तब जंजीर हो सकता है जो सिर्फ अनुरोध को प्रिंट करता है। Example
-3

आप IntentBrite एपीआई के साथ एक ही मुद्रीकरण परिणामों को प्राप्त कर सकता है और साथ ही

-2

मैं वसंत में ऐसा किया यह ठीक काम कर रहा है।

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

कोड को चिपकाने के बजाय, यह कोड करना अच्छा होगा कि कोड क्या करता है – Joel

संबंधित मुद्दे