2009-07-27 10 views
7

मैं PHP और पायथन में एक वेब सेवा का परीक्षण कर रहा था। वेब सेवा का पता था, मान लें, http://my.domain.com/my/webservice। जब मैंने उस यूआरएल का उपयोग करके PHP में वेब सेवा का परीक्षण किया तो सबकुछ ठीक काम करता था। लेकिन, जब मैंने एक ही स्थान का उपयोग किया लेकिन पाइथन में SOAPpy का उपयोग करके मुझे एक त्रुटि मिली। कि अगर मैं एक जोड़नेक्यों वेब सेवा में पिछला स्लैश इतना महत्वपूर्ण है?

HTTPError: <HTTPError 301 Moved Permanently> 

मैं यह पता लगाने:

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice', namespace) 
server.myFunction() 

जवाब मैं सर्वर से मिला:

नीचे कोड मैं वेब सेवा के साथ संवाद करने के लिए इस्तेमाल किया (अजगर) है वेब सेवा स्थान पर पीछे हटना यह काम करता है!

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace) 
server.myFunction() 

पिछली स्लैश की कमी में त्रुटि क्यों होती है?

उत्तर

19

वे अलग-अलग यूआरएल हैं। http://my.domain.com/my/webservice फ़ोल्डर में फ़ाइल webservice का तात्पर्य है। http://my.domain.com/my/webservice/ मेरे/webservice फ़ोल्डर के अंदर डिफ़ॉल्ट दस्तावेज़ का तात्पर्य है।

कई वेबसर्वर स्वचालित रूप से ऐसे यूआरएल को सही कर देंगे, लेकिन ऐसा करने के लिए उनके लिए आवश्यक नहीं है।

3

क्योंकि वास्तविक सर्वर URL है: http://my.domain.com/my/webservice/

पीएचपी पुस्तकालय डिफ़ॉल्ट रूप से रीडायरेक्ट निम्नलिखित होना चाहिए।

2

[अस्वीकरण: यह मेरे उत्तर की एक प्रति from here है। मैं जानता हूँ कि कुछ लोगों को नकल के इस प्रकार पसंद नहीं है, लेकिन यह बताता है कि क्यों स्लेश महत्वपूर्ण है।]

कल्पना कीजिए कि आप एक पृष्ठ

http://mydomain.com/bla 

कि

<a href="more.html">Read more...</a> 

पर क्लिक करने पर होता है की सेवा , उपयोगकर्ता का ब्राउज़र http://mydomain.com/more.html पुनर्प्राप्त करेगा। था आप के बजाय सेवा की

http://mydomain.com/bla/ 

(एक ही सामग्री के साथ), ब्राउज़र http://mydomain.com/bla/more.html पुनः प्राप्त होगा। इस अस्पष्टता से बचने के लिए, यदि URL किसी निर्देशिका को इंगित करता है तो पुनर्निर्देशन एक स्लैश जोड़ता है।

3

त्रुटि एक 301 रीडायरेक्ट है जिसका अर्थ है कि आपको वेब सर्वर द्वारा अंत में स्लैश के साथ यूआरएल पर रीडायरेक्ट किया जा रहा है।

ऐसा लगता है कि PHP स्वचालित रूप से इस रीडायरेक्ट का पालन करेगा और इस प्रकार त्रुटि को फेंक नहीं देगा, जबकि पायथन नहीं होगा। आप निम्न कार्य करने की आवश्यकता होगी: प्रारंभिक URL

  • पकड़ने किसी भी 301 रीडायरेक्ट करने के लिए कनेक्ट करने के लिए

    1. प्रयास करें और संभवतः 302 के साथ-साथ पुनर्निर्देश
    2. अगर वहाँ एक रीडायरेक्ट तो बजाए उस विशिष्ट URL कनेक्ट करने का प्रयास था ।

    नया यूआरएल प्रतिक्रिया शीर्षकों में उपलब्ध होना चाहिए।

    एचटीएच।

  • 0

    यदि कोई स्लैश आवश्यक है तो सर्वर पर एसओएपी-यूआरएल जैसा दिखता है, सर्वर और एसओएपी कार्यान्वयन पर निर्भर करता है।

    आपके मामले में, मुझे लगता है कि लक्ष्य सर्वर एक अपाचे सर्वर है और SOAP यूआरएल वास्तव में एक निर्देशिका है जिसमें आपकी एसओएपी हैंडलिंग स्क्रिप्ट शामिल है। जब आप सर्वर पर http://my.domain.com/my/webservice एक्सेस करते हैं, तो अपाचे निर्णय लेता है कि निर्देशिका को http://my.domain.com/my/webservice/ के रूप में ठीक से संबोधित किया गया है और एक 301 रीडायरेक्ट भेजता है।

    एसओएपी एक http POST का उपयोग करता है, यह तय करने के लिए क्लाइंट तक है कि रीडायरेक्ट का पालन किया जाना चाहिए या नहीं, मुझे लगता है कि यह सिर्फ एक की अपेक्षा नहीं करता है।

    SOAP के अन्य कार्यान्वयन, उदा। जावा में अपाचे एक्सिस में ऐसे यूआरएल हैं जो सर्वलेट्स की तरह दिखते हैं, उदा। बिना 0 स्लैश के http://domain.com/soap/webservice, इस मामले में स्लैश के बिना यूआरएल सही है, वैसे भी कोई निर्देशिका नहीं है जो वैसे भी मौजूद है।

    एक्सिस रीडायरेक्ट पर भी विफल रहता है, मुझे लगता है।

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