2010-02-19 7 views
8

मैं एक एसओएपी सेवा तक पहुंचने की कोशिश कर रहा हूं जिसे मैं नियंत्रित नहीं करता हूं। कार्यों में से एक को ProcessMessage कहा जाता है। मैंने उदाहरण का पालन किया और एक एसओएपी अनुरोध उत्पन्न किया, लेकिन मुझे यह कहते हुए एक त्रुटि मिली कि कार्रवाई मौजूद नहीं है। मैंने लिफाफा के शरीर के तरीके से समस्या का पता लगाया।रूबी साबुन संचार के लिए savon का उपयोग करते समय "wsdl" नेमस्पेस कार्रवाई नाम में क्यों इंजेक्शन दिया गया है?

<env:Envelope ... "> 
    <env:Header> 
     <wsse:Security ... "> 
      <wsse:UsernameToken ..."> 
       <wsse:Username>USER</wsse:Username> 
        <wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce> 
        <wsu:Created>2010-02-18T02:05:25Z</wsu:Created> 
        <wsse:Password ... >password</wsse:Password> 
      </wsse:UsernameToken> 
     </wsse:Security> 
    </env:Header> 
    <env:Body> 
     <wsdl:ProcessMessage> 
      <payload> 
       ...... 
      </payload> 
     </wsdl:ProcessMessage> 
    </env:Body> 
</env:Envelope>  

कि ProcessMessage टैग होना चाहिए:

<ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport"> 

है यही कारण है कि यह क्या है जब यह नमूना जावा एप्लिकेशन द्वारा उत्पन्न होता है, और यह काम करता है। यह टैग मेरा रूबी ऐप जेनरेट और नमूना जावा ऐप के बीच एकमात्र अंतर है। क्या उस टैग के सामने "wsdl:" नामस्थान से छुटकारा पाने का कोई तरीका है और इस तरह की विशेषता जोड़ें। इसके अलावा, क्या शरीर के बाकी हिस्सों की तरह स्ट्रिंग के रूप में पारित होने के लिए क्रिया को बल देने के लिए कोई तरीका नहीं है?

यहाँ मेरी कोड है:

require 'rubygems' 
require 'savon' 
client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl" 

response = client.process_message! do | soap, wsse | 
wsse.username = "USER" 
wsse.password = "password" 
soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference 
soap.action = "ProcessMessage" #makes no difference 
soap.input = "ProcessMessage" #makes no difference 

#my body at this point is jsut one big xml string 

soap.body = "<payload>...</payload>" 
# putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting <wsdl:ProcessMessage> tag. 

    end 

मैं handsoap की कोशिश की लेकिन यह HTTPS का समर्थन नहीं करता और भ्रामक है। मैंने साबुन 4 आर की कोशिश की लेकिन यह हैंडसोप से भी ज्यादा भ्रमित है।

+0

इस के लिए एक टिकट पर खुला था: http://github.com/rubiii/savon/issues#issue/39 – rubiii

+0

हाय निक, आप कहीं से मिला इसके साथ में मैं एक ही मुद्दा देख रहा हूं। –

+0

हाय स्टीव। मैंने इस स्थिति का इंतजार प्रतीक्षा स्थिति पर रखा - क्योंकि अन्य, अधिक महत्वपूर्ण, सुविधाओं को कार्यान्वयन की आवश्यकता थी, और यह "अच्छी" सूची में था। मैं आज बाद में आपके समाधान का प्रयास करूंगा और देख सकता हूं कि क्या काम करता है। मुझे आपको बताने के लिए धन्यवाद! – konung

उत्तर

4

स्टीव, आप देखते हैं कि wsdl: ProcessMessage टैग के सामने? - मैंने सोचा था कि यह एकमात्र चीज थी जो मुझे फेंक रही थी लेकिन इसकी नहीं (जिस तरह से यह लाइन 160 पर सावन लिब में साबुन.आरबी में स्थापित है)। यहां तक ​​कि अगर मैं इसे साबुन में नामांकित नहीं करता हूं। नामस्थान - यह हार्ड एक्सएमएल में हार्ड जेनरेट और संलग्न है। मेरी सेवा द्वारा अनुमति नहीं है।

जबकि जेनरेट किया गया एक्सएमएल एक वैध एक्सएमएल है - यह उस सेवा की आवश्यकता से पूरा नहीं है जिसे मैं बात करने की कोशिश कर रहा हूं। अर्थात्: उत्पन्न xml में,

<?xml version="1.0" encoding="UTF-8"?> 

टैग गुम है, भी, मैं PayloadManifest शीर्षक में की जरूरत है, के साथ साथ मैं WSU की जरूरत है: बनाया है और WSU: मेरे wsse में समाप्त हो: टैग, लेकिन उन्हें लागू नहीं कर रहे हैं, आदि , आदि। अन्य छोटे quirks का एक गुच्छा जो मेरे मामले के लिए बहुत विशिष्ट हैं। हालांकि साबुन में एक निजी विधि = xml_body है। इसके अलावा to_xml विधि में साबुन lib यह जांच कर रहा है कि @xml_body पहले से सेट है, इसे स्वयं का एक्सएमएल उत्पन्न करने से पहले। तो मैंने साबुन के धीरे-धीरे संशोधित व्यवहार को समाप्त कर दिया। soap.xml_body = सार्वजनिक रूप से पहुंच योग्य बनाकर। तो मैं ऐसा करने में सक्षम था:

response = client.process_message! do |soap| 
soap.action = "http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage" 
soap.xml_body = "MY XML STRING GENERATED ELSEWHERE GOES HERE" 
end 

जो अंत में काम करता है !!!!

मैं इसे rubii के लिए सुझाव दूंगा - यदि यह विकल्प उपलब्ध हो जाता है जो बहुत दुर्लभ मामलों को हल करेगा - जहां लोग अपना कस्टम एक्सएमएल उत्पन्न कर सकते हैं और शेष savon lib का उपयोग कर सकते हैं।

+0

यह एक अच्छा समाधान होगा जो मुझे लगता है। मैंने पाया कि आईआईएस/नेट नामस्थान की कमी के बारे में शिकायत कर रहा था लेकिन इस पर ध्यान नहीं दिया कि फ़ाइल के शीर्ष पर निर्देश था या नहीं। शुभकामनाएं, यह उस बिंदु पर बहुत दर्दनाक था। गेटचा # 2 .. –

10

आपको soap.input में एक सरणी पास करने की आवश्यकता है जिसमें दूसरा तत्व हैश नाम विवरण है।

soap.input = [ 
    "ProcessMessage", 
    {"xmlns" => "http://www.starstandards.org/webservices/2005/10/transport"} 
] 

यह सुनिश्चित करना चाहिए कि आप मुख्य तत्व के गुण के रूप में नाम घोषणा घोषणा के साथ समाप्त हो जाएं।

आप शायद यह भी एक नाम स्थान घोषणा के साथ इतना

<env:Body> 
    <wsdl:ProcessMessage xmlns="........." > 
     <payload> 
      ...... 
     </payload> 
    </wsdl:ProcessMessage> 
</env:Body> 

तरह तत्व से पहले खत्म हो जाएगा, लेकिन यह मेरे लिए कोई मुद्दा नहीं था, यह उस मुद्दा था नाम स्थान विशेषता की कमी, नहीं था तत्व से पहले नामस्थान की उपस्थिति।

+0

स्टीव। आपके संदेश के लिए धन्यवाद - यह मेरा समाधान नहीं है, लेकिन यह मुझे लॉग को और सावधानीपूर्वक देखने के लिए मिला। मेरा अपना जवाब देखें। टिप्पणियों में यहां पर्याप्त जगह नहीं है। :-) – konung

+0

धन्यवाद, आपके समाधान ने अभी एक आकर्षण का काम किया था जब मुझे एक ही समस्या थी। –

+0

आपका समाधान मेरे लिए काम किया। मैं कार्रवाई के अंदर xmlns याद कर रहा था! मुझे अभी भी wsdl मिलता है: शरीर के अंदर नेमस्पेस, लेकिन यह एसओएपी अनुरोध को प्रभावित नहीं करता है। – pedrofalcaocosta

7

मेरी वेब सेवा के लिए मुझे स्टीव के समाधान के शीर्ष पर "wsdl" नेमस्पेस से छुटकारा पाने की आवश्यकता थी।

Savon साथ परीक्षण किया गया 0.9.6:

client = Savon::Client.new "https://example.com/webservice/account.asmx?WSDL" 
response = client.request "GetAccount" do 
    # Gotcha 1: set default namespace for body elements 
    soap.input = ["GetAccount", {"xmlns" => "https://example.com/webservice/"}] 
    soap.body = { 
    "AccountID" => 1234 
    } 
    # Gotcha 2: get rid of namespace declaration of body elements 
    soap.element_form_default = :unqualified 
    # Gotcha 3: set SOAPAction different from default 
    http.headers["SOAPAction"] = '"https://example.com/webservice/GetAccount"' 
end 
+2

+1। – abhijit

+0

शानदार उत्तर के लिए –

+0

गोटा 2 मुझे मार रहा था, धन्यवाद केंजी! – zrl3dx

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