2008-10-22 15 views
7

मैं एक सक्रिय संसाधन स्रोत को डीबग करने का प्रयास कर रहा हूं जो काम नहीं कर रहा है।मैं ActiveResource अनुरोध पर HTTP प्रतिक्रिया कैसे देखूं?

ActiveResource अनुरोध के HTTP प्रतिक्रिया को देखने का सबसे अच्छा तरीका क्या है?

उत्तर

3

यह आसान है। बस वापस आने वाली प्रतिक्रिया को देखें। :)

दो विकल्प:

  • आप अपने कंप्यूटर पर स्रोत फ़ाइल है। संपादित करें। उपयुक्त जगह पर puts response.inspect रखो। इसे हटाने के लिए याद रखें।
  • रूबी के पास खुली कक्षाएं हैं। सही विधि ढूंढें और इसे ठीक से करने के लिए इसे फिर से परिभाषित करें, या उपनाम का उपयोग करें और ऐसा करने के लिए चेनिंग कॉल करें। शायद एक तरीका है जो प्रतिक्रिया देता है - इसे पकड़ो, इसे प्रिंट करें, और फिर इसे वापस करें।

बाद के विकल्प का एक मूर्ख उदाहरण है।

# Somewhere buried in ActiveResource: 
class Network 
    def get 
    return get_request 
    end 

    def get_request 
    "I'm a request!" 
    end 
end 

# Somewhere in your source files: 
class Network 
    def print_request 
    request = old_get_request 
    puts request 
    request 
    end 
    alias :old_get_request :get_request 
    alias :get_request :print_request 
end 

कल्पना करें कि प्रथम श्रेणी परिभाषा ActiveRecord स्रोत फ़ाइलों में है। दूसरी कक्षा परिभाषा कहीं आपके आवेदन में है।

$ irb -r openclasses.rb 
>> Network.new.get 
I'm a request! 
=> "I'm a request!" 

आप देख सकते हैं कि यह इसे प्रिंट करता है और फिर इसे वापस करता है। साफ, हुह?

(। और हालांकि मेरी सरल उदाहरण के बाद से यह रेल का उपयोग नहीं कर रहा है इसका इस्तेमाल नहीं करता है, बाहर alias_method_chain जाँच अपना उपनाम कॉल गठबंधन करने के लिए)

0

शायद यातायात स्नफ़फर का उपयोग करने का सबसे अच्छा तरीका है।

(जो पूरी तरह से काम करेगा ... मेरे मामले में छोड़कर यातायात मैं देखना चाहता हूँ एन्क्रिप्टेड है। डी 'ओह!)

+0

चार्ल्स 'एचटीटीपीएस प्रॉक्सी इस तरह की चीज़ के लिए बहुत उपयोगी है। –

0

या चीजों में हो रही है जब मैं सटीक आंतरिक पता नहीं है की मेरी विधि सचमुच सिर्फ "डीबगर" कथन में फेंकने के लिए, "स्क्रिप्ट/सर्वर - डीबगर" का उपयोग कर सर्वर शुरू करें और तब तक कोड के माध्यम से कदम उठाएं जब तक कि मैं उस स्थान पर नहीं हूं, फिर आईआरबी में कुछ निरीक्षण शुरू करें। .... इससे मदद मिल सकती है (हे ल्यूक बीटीडब्ल्यू)

3

मुझे Wireshark पसंद है क्योंकि आप इसे वेब ब्राउज़र क्लाइंट एंड (आमतौर पर आपकी विकास मशीन) पर सुनना शुरू कर सकते हैं और फिर पृष्ठ अनुरोध कर सकते हैं। फिर आप एचटीटीपी पैकेट पा सकते हैं, एचटीएमएल को आगे और आगे जाने वाले HTTP को देखने के लिए राइट क्लिक करें और "वार्तालाप का पालन करें"।

1

यह केवल काम करता है अगर आप भी सर्वर पर नियंत्रण:

URL है, जो कहा जाता था बाहर सर्वर लॉग और मछली पालन करें:

Completed in 0.26889 (3 reqs/sec) | Rendering: 0.00036 (0%) | DB: 0.02424 (9%) | 200 OK [http://localhost/notifications/summary.xml?person_id=25738] 

और फिर खोलने कि फ़ायरफ़ॉक्स में। यदि सर्वर सचमुच रीस्टफुल (यानी स्टेटलेस) है तो आपको एआरएस के समान प्रतिक्रिया मिल जाएगी।

14

बंदरगाह वेबसाइट का उपयोग कर सकते हैं बंदर नेट :: HTTP डीबग मोड सक्षम करने के लिए कनेक्शन पैच करें। https://gist.github.com/591601 देखें - मैंने इसे ठीक से हल करने के लिए लिखा है।इस रेल को अपने रेल ऐप में जोड़ने से आपको Net::HTTP.enable_debug! और Net::HTTP.disable_debug! मिल जाएगा जो आप डीबग जानकारी प्रिंट करने के लिए उपयोग कर सकते हैं।

नेट :: HTTP डीबग मोड असुरक्षित है और उत्पादन में उपयोग नहीं किया जाना चाहिए, लेकिन डीबगिंग के लिए बेहद जानकारीपूर्ण है।

+0

यह ठीक काम करता है! – huug

+1

धन्यवाद, आपने अभी मुझे बहुत समय बचाया है! – awendt

+0

बहुत उपयोगी, बहुत बहुत धन्यवाद! – Geoffroy

4

config/initializers/ निम्नलिखित सामग्री के साथ 'debug_connection.rb' कहा जाता है के लिए एक नई फ़ाइल जोड़ें:

class ActiveResource::Connection 
    # Creates new Net::HTTP instance for communication with 
    # remote service and resources. 
    def http 
    http = Net::HTTP.new(@site.host, @site.port) 
    http.use_ssl = @site.is_a?(URI::HTTPS) 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl 
    http.read_timeout = @timeout if @timeout 
    # Here's the addition that allows you to see the output 
    http.set_debug_output $stderr 
    return http 
    end 
end 

यह $ करने के लिए पूरे नेटवर्क यातायात प्रिंट होगा stderr।

0

मैं अपने ऐप को आउटपुट करने के लिए पैच करने के बजाए तार पर जा रहे यातायात को देखने के लिए यहां TCPFlow का उपयोग करता हूं।

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