2012-02-11 10 views
5

मुझे एक पर्ल प्रोग्राम में कुछ HTTP यूआरएल को संभालने की ज़रूरत है, लेकिन मुझे संदेह है कि URI कक्षा मुझे कैसे मदद करनी चाहिए।मुझे पर्ल यूआरआई कक्षा का उपयोग कैसे करना चाहिए?

विशेष रूप से, मैं संबंधित URL को हल करने और उनके घटकों को प्राप्त करने के लिए URI कक्षा का उपयोग करना चाहता हूं। हालांकि, समस्याएं हैं:

  1. मैं एक समारोह के दोनों URI वस्तुओं और तर्कों के रूप यूआरआई तार के साथ काम (या केवल एक ही पारित हो यह सुनिश्चित)

    sub foo_string_or_url { 
        my $uri = URI->new(shift); 
    

    कि सही दृष्टिकोण है करने की आवश्यकता है? मुझे यह पसंद नहीं है, क्योंकि यह URI को स्ट्रिंग करता है और अनावश्यक रूप से नई वस्तु बनाता है।

  2. निकालें घटकों

    my $host = $uri->host; 
    

    यह भी समस्याग्रस्त है, क्योंकि सभी URI रों, मेजबान है विशेष रूप से, अगर कोई कार्य करने के लिए कचरा गुजरता है, यह होगा die()

  3. हल एक सापेक्ष URL

    my $new_url = URI::URL->new($uri, $base)->abs; 
    

    IIUC, ->abs बिना, परिणाम अभी भी सापेक्ष URL को stringify (और HTTP::Request रों लिए काम नहीं करेगा), मैं सही हूँ? इसके अलावा, क्या यह URI वापस करने की गारंटी है?

मुझे इन समस्याओं को कैसे संभालना चाहिए? संभावनाओं

  • उपयोग ->isa('URI') और ->can("host") हर समय
    • त्रुटियों की संभावना है और मुझे लगता है बदसूरत हैं
  • बिल्कुल URI वर्ग का उपयोग करें और regexes
    • का उपयोग करके URL पार्स न करें मैं अभी भी अपने खुद के
  • डीबग करने के बजाय लाइब्रेरी समाधान का उपयोग करूंगा
  • लपेटें URItry { ... } catch { ... }
    • में आपरेशन पहला बिंदु

देख वहाँ URI वर्गों का उपयोग करने का एक समझदार, मूर्ख प्रूफ तरीका है? कुछ सरल मैंने नहीं सोचा है (उपरोक्त सूची में)?

उत्तर

7

मुझे लगता है कि आपका प्रश्न संक्षेप में किया जा सकता है: पैरामीटर सत्यापन कठिन है, मैं इसके बारे में क्या करूँ?

  1. मुझे यह पसंद नहीं है, या तो। यह डेवलपर्स के बीच अलग राय का विषय है, अन्य कहते हैं जबरन कटा हुआ रोटी से बेहतर है, खासकर जब मूस द्वारा स्वचालित रूप से किया जाता है।मैं तर्क देता हूं कि केवल एक ही प्रकार की प्रोग्राम को सरल बनाता है। इसके अलावा, YAGNI अधिकांश मामलों में लागू होता है। गलत प्रकारों को अस्वीकार करें, अपने कोड नमूने में दिखाए गए मैन्युअल चेक से बचने के लिए Params::Validate/MooseX::Method::Signatures/MooseX::Declare जैसे एक सहायक मॉड्यूल को नियोजित करें।

  2. यह वांछित व्यवहार है। अपवाद हैंडलिंग तंत्र आपको प्रत्येक स्थिति के लिए उपयुक्त कस्टम कोड लिखने देते हैं। अगर आपको लगता है कि यह सौंदर्यपूर्ण रूप से प्रसन्न नहीं है, तो इसे हटा दें और अपवादों को अनचेक करने के परिणामों को ध्यान में रखें।

    use Try::Tiny; 
    my $host; 
    try { 
        $host = $uri->host; 
    } catch { 
        warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n"; 
        … 
    }; 
    
  3. हाँ और हाँ।

+3

केवल एक ही प्रश्न का उत्तर नहीं दिया गया है "मुझे इन समस्याओं को कैसे संभालना चाहिए?", और जवाब "हमेशा कॉल करें"। यदि आपके पास पहले से ही एक पूर्ण यूआरआई है तो यह कुछ भी नहीं करेगा। – ikegami

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