गो

2013-01-19 31 views
10

में रीडायरेक्ट किए बिना क्वेरी यूआरएल मैं रीडायरेक्ट स्क्रिप्ट के लिए बेंचमार्क टेस्ट लिख रहा हूं।गो

मैं अपने प्रोग्राम को कुछ यूआरएल से पूछताछ करना चाहता हूं जो ऐपस्टोर पर रीडायरेक्ट करता है। लेकिन मैं ऐपस्टोर पेज डाउनलोड नहीं करना चाहता हूं। मैं सिर्फ यूआरएल या त्रुटि को रीडायरेक्ट करना चाहता हूं।

मैं दूसरी रीडायरेक्ट क्वेरी के बिना क्वेरी यूआरएल पर कैसे कहूं?


अद्यतन

दोनों उत्तर सही हैं, लेकिन:

मैं दोनों समाधान की कोशिश की। मैं बेंचमार्किंग कर रहा हूं। मैं 10 या 500 जाने वाली दिनचर्या के साथ 1 या कई प्रक्रियाएं चलाता हूं। वे एक लूप में यूआरएल पूछताछ। मेरा सर्वर भी जाने में लिखा गया है। यह हर दूसरे अनुरोधों की संख्या की रिपोर्ट करता है।

  • पहले समाधान: http.DefaultTransport.RoundTrip - धीमी गति से काम करता है, त्रुटियों देता है। पहले 4 सेकंड ठीक काम करता है। 300-500 प्रश्नों को बनाते हुए प्रदर्शन प्रति सेकेंड 80 क्वेरी तक गिर जाता है।

तो प्रति सेकंड 0-5 क्वेरी के लिए चला जाता है और queryies स्क्रिप्ट

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond. 

की तरह हो रही त्रुटियों शुरू मैं इसे फिर से उपयोग कनेक्शन बंद कर दिया है लगता है।

  • दूसरा समाधान: CheckRedirect field निरंतर प्रदर्शन के साथ काम करता है। मुझे यकीन नहीं है कि यह कनेक्शन का दोबारा उपयोग करता है या यह हर अनुरोध के लिए एक नया कनेक्शन खोलता है। मैं लूप में प्रत्येक अनुरोध के लिए client बना देता हूं। इस तरह यह वास्तविक जीवन में व्यवहार करेगा (प्रत्येक अनुरोध एक नया कनेक्शन है)। क्या यह सुनिश्चित करने का कोई तरीका है कि प्रत्येक क्वेरी के बाद कनेक्शन बंद हो जाएं और फिर से उपयोग न करें?

यही कारण है कि मैं दूसरे समाधान को चिह्नित करने जा रहा हूं जैसे कि मेरे प्रश्न का उत्तर दें। लेकिन मेरे शोध के लिए यह बहुत महत्वपूर्ण है कि प्रत्येक क्वेरी एक नया कनेक्शन था। मैं दूसरे समाधान के साथ कैसे सुनिश्चित कर सकता हूं?

उत्तर

14

पूर्णता 'के लिए, आप एक http.Client उपयोग कर सकते हैं और पुनर्निर्देश का पालन नहीं। http.Client में CheckRedirect field है जो एक फ़ंक्शन है। इसे किसी भी पुनर्निर्देशन का पालन करने से पहले कहा जाता है।

इस समारोह एक त्रुटि देता है, तो httpClient.Do(...)नहीं रीडायरेक्ट का पालन करेंगे (doFollowingRedirects() function in Go's source code देखें) और बजाय एक त्रुटि वापस आ जाएगी (अपनी ठोस प्रकार url.Error हो जाएगा, और उसके URL क्षेत्र URL पर रीडायरेक्ट-हो जाएगा, उर्फ स्थान शीर्षलेख मान, see this code)।

तुम मेरे gocrawl library इस प्रयोग का एक ठोस उदाहरण के लिए देख सकते हैं।

+0

धन्यवाद। क्या यह सुनिश्चित करना था कि प्रत्येक अनुरोध के बाद कनेक्शन बंद हो जाए?मैं सोशल नेटवर्क से भारी ट्रैफिक अनुकरण करना चाहता हूं जिसे एजेंट हेडर के आधार पर 1-5 मिनट में फिर से निर्देशित किया जाना चाहिए। तो प्रत्येक उपयोगकर्ता केवल एक बार पूछताछ करता है और पुनर्निर्देशित किया जाना चाहिए। (वह कनेक्शन बंद होना चाहिए) – Max

+0

मुझे यकीन नहीं है कि मैं लोड परीक्षण/बेंचमार्किंग टूल के लिए एक कस्टम क्लाइंट तैयार करूंगा। मैं अपाचे बेंच (एबी, http://httpd.apache.org/docs/2.2/programs/ab.html) जैसे कुछ का उपयोग करने का सुझाव दूंगा। – mna

+0

मुझे पता है अब। लेकिन मैं नेटवर्किंग को बेहतर तरीके से जानना चाहता हूं। इस तरह के एक मामूली मामला पाठ्यक्रम इतने सारे सवाल। धन्यवाद – Max

19

आपको http.Client के बजाय http.Transport का उपयोग करने की आवश्यकता है। परिवहन निम्न स्तर है और रीडायरेक्ट का पालन नहीं करता है।

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) 
// ... 
resp, err := http.DefaultTransport.RoundTrip(req) 

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

  • कोई संबंधित समस्या नहीं^_^