2011-05-02 10 views
21

पर भेजे बिना सावन अनुरोध एक्सएमएल देखें मैं नीचे दिए गए जैसा कोड का उपयोग करके एसओएपी अनुरोध करने के लिए सावन मणि का उपयोग कर रहा हूं। यह काम कर रहा है, लेकिन मैं वास्तव में उनके सर्वर पर कॉल किए बिना अनुरोध एक्सएमएल को देखना/कैप्चर करना चाहता हूं। अनुरोध के बाद और क्लाइंट वैरिएबल का निरीक्षण करने के बाद डीबगर लाइन चिपकाने के अनुरोध के बाद मैं इसे देख सकता हूं।सर्वर

क्या कोई वास्तव में अनुरोध किए बिना अनुरोध एक्सएमएल देखने का तरीका जानता है? मैं ककड़ी या रुपेक का उपयोग कर एक स्कीमा के खिलाफ एक्सएमएल को प्रमाणित करने में सक्षम होना चाहता हूं।

client = Savon::Client.new do |wsdl, http| 
    wsdl.document = "http://fakesite.org/fake.asmx?wsdl" 
end 

client.request(:testpostdata, :xmlns => "http://fakesite.org/") do 
    soap.header = { :cAuthentication => {"UserName" => "MyName", "Password" => "MyPassword" } } 
    soap.body = { :xml_data => to_xml } 
end 

उत्तर

7

SavonHTTPI का उपयोग करता सोप अनुरोध निष्पादित करने के लिए। HTTPI विभिन्न रूबी HTTP क्लाइंट्स के शीर्ष पर एक आम इंटरफ़ेस है।

HTTPI.expects(:post).with do |http| 
    SchemaValidation.validate(:get_user, http.body) 
end 

कृपया ध्यान दें कि मैं, सोप अनुरोध मजाक HTTP शरीर हो रही है और कुछ सत्यापन विधि (छद्म कोड) के खिलाफ यह सत्यापित करने के लिए इस्तेमाल किया Mocha: आप सकता है शायद नकली/HTTP अनुरोध के माध्यम से Savon द्वारा निष्पादित ठूंठ।

वर्तमान में, सावन उन्हें निष्पादित किए बिना अनुरोधों का निर्माण करने का समर्थन नहीं करता है। इसलिए अनुरोध को सत्यापित करने का एकमात्र तरीका इसे रोकना होगा।

यदि आपको इस सुविधा का समर्थन करने के लिए सावन की आवश्यकता होगी, तो कृपया मुझे बताएं और open a ticket over at GitHub

संपादित करें: savon_spec भी है, जो सावन के साथ मूल स्थिरता-आधारित परीक्षण के लिए थोड़ा सहायक है।

+0

सुझाव के लिए धन्यवाद। मैं सुविधा के बिना जी सकता हूं, सिर्फ यह जानना चाहता था कि यह संभव था या नहीं। –

10

जबकि मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है, मैं सिर्फ प्रतिक्रिया को ओवरराइड करता हूं।

class Savon::SOAP::Request 
    def response 
    pp self.request.headers 
    puts 
    puts self.request.body 
    exit 
    end 
end 
+0

डीबग की सहायता के लिए यह सस्ता और आसान तरीका था। धन्यवाद। –

+0

और इसके बारे में क्या होगा यदि मैं इसे चाहता हूं लेकिन सर्वर से अनुरोध भी भेजूं? – Fakada

+0

@ फ़काडा 'सुपर' –

8

उन्होंने अंतिम पोस्ट के बाद से एपीआई अपडेट किया है। Savon.client में यह सेटिंग सेट करें:: pretty_print_xml => true। अपनी कॉल के बाद, SOAP अनुरोध के लिए लॉग खोजें:। उत्पादन stdout में डाल दिया जाता है। यदि आप कंसोल से अपने कनेक्शन का परीक्षण कर रहे हैं तो कंसोल कंसोल इतिहास देखें।

5

मैं एक ही मुद्दा था और Savon समझौता इस प्रकार है:

module Savon 
    class Client 
    def get_request_xml operation_name, locals 
     Savon::Builder.new(operation_name, @wsdl, @globals, locals).pretty 
    end 
    end 
end 

यह XML बनाता है और यह एपीआई समाप्ति बिंदु को भेजे बिना एक स्ट्रिंग के रूप में यह देता है। यह क्लाइंट.call के समान ही एक ब्लॉक तर्क स्वीकार नहीं करता है, इसलिए यह आपके द्वारा किए जा रहे हर प्रकार के अनुरोध को पुन: उत्पन्न करने में सक्षम नहीं होगा, लेकिन यह अब मेरी आवश्यकताओं को पूरा करता है।

34

सावन 2 का उपयोग करके मैं इसे इस तरह से करता हूं, एक विधि लिखता हूं जो क्लाइंट से अनुरोध निकाय लौटाता है।

client = Savon::Client.new(....) 
इस

प्रलेखन

def get_request 
    # list of operations can be found using client.operations 
    ops = client.operation(:action_name_here) 

    # build the body of the xml inside the message here   
    ops.build(message: { id: 42, name: "Test User", age: 20 }).to_s 
    end 
+0

' .pretty' शरीर को – akz92

+0

पढ़ने के लिए आसान बनाता है (ऊपर 'सुंदर 'के साथ' to_s' को प्रतिस्थापित करें) –

9

मैं Savon 2.11 उपयोग कर रहा हूँ में उल्लेख नहीं किया है और मैं ग्राहक में वैश्विक के साथ पूरा कर सकते हैं: फिर

def client 
    @client ||= Savon.client(soap_version: 2, 
          wsdl:   config.wsdl, 
          logger:  Rails.logger, 
          log:   true) 
end 

More info on the globals here.

लॉगर होस्ट, http क्रिया और पूर्ण एक्सएमएल ("हेडर" और बो डीई) दोनों अनुरोध और प्रतिक्रिया के लिए।

11

आप सीधे Savon::Client#build_request विधि के माध्यम से सीधे कर सकते हैं।

उदाहरण:

request = client.build_request(:some_operation, some_payload) 
request.body # Get the request body 
request.headers # Get the request headers 

पूर्ण दस्तावेज़ के लिए एक चोटी @https://github.com/savonrb/savon/blob/master/lib/savon/request.rb लो।

+0

यह सही उत्तर होना चाहिए क्योंकि यह सबसे प्रत्यक्ष है और किसी भी हिस्से को संशोधित किए बिना सावन का उपयोग करता है इसका – codeshaman

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