2011-03-24 13 views
8

से कॉल करती है मैं वेब पेज से एसओएपी वेब सेवा में सफलतापूर्वक वेब सेवा कॉल करने के लिए संघर्ष कर रहा हूं। वेब सेवा एक जावा वेब सेवा है जो जेएक्स-डब्ल्यूएस का उपयोग करती है।एसओएपी वेब सेवा जावास्क्रिप्ट

@WebMethod 
public String sayHi(@WebParam(name="name") String name) 
{ 
    System.out.println("Hello "+name+"!"); 
    return "Hello "+name+"!"; 
} 

मैं वेब सेवा कॉल JQuery पुस्तकालय jqSOAPClient (http://plugins.jquery.com/project/jqSOAPClient) का उपयोग कर की कोशिश की है:

यहाँ वेब विधि है कि मैं फोन करने के लिए कोशिश कर रहा हूँ है।
यहाँ कोड है कि मैं का उपयोग किया है है:

var processResponse = function(respObj) 
{ 
    alert("Response received: "+respObj); 
}; 

SOAPClient.Proxy = url; 
var body = new SOAPObject("sayHi"); 
body.ns = ns; 
body.appendChild(new SOAPObject("name").val("Bernhard")); 

var sr = new SOAPRequest(ns+"sayHi",body); 
SOAPClient.SendRequest(sr,processResponse); 

कोई जवाब नहीं वापस आ रहा जा रहा है। jqSOAPClient.js में जब मैं xData.responseXML डेटा सदस्य लॉग करता हूं तो मुझे 'अपरिभाषित' मिलता है। वेब सेवा में मैं चेतावनी दिखाई

24 मार्च 2011 10:49:51 com.sun.xml.ws.transport.http.server.WSHttpHandler handleExchange चेतावनी: HTTP विधि संभाला नहीं जा सकता: विकल्प

मैंने जावास्क्रिप्ट लाइब्रेरी, soapclient.js (http://www.codeproject.com/kb/Ajax/JavaScriptSOAPClient.aspx) का उपयोग करने का भी प्रयास किया है। क्लाइंट पक्ष कोड कि मैं यहाँ का उपयोग

var processResponse = function(respObj) 
{ 
    alert("Response received: "+respObj); 
}; 

var paramaters = new SOAPClientParameters(); 
paramaters.add("name","Bernhard"); 
SOAPClient.invoke(url,"sayHi",paramaters,true,processResponse); 

मैं soapclient.js कि डबल्यूएसडीएल को हासिल करेगा में भाग को नजरअंदाज कर दिया है, क्योंकि यह काम नहीं करता है (मैं एक मिलता है: IOException: An established connection was aborted by the software in your host machine वेब सेवा की ओर) । डब्ल्यूएसडीएल को केवल उपयुक्त नाम स्थान के उपयोग के लिए पुनर्प्राप्त किया गया है, इसलिए मैंने वैरिएबल एनएस को वास्तविक नाम स्थान से बदल दिया है।

मुझे पहले से ही वेब सेवा पर एक ही चेतावनी मिलती है (HTTP विधि को नियंत्रित नहीं कर सकता: विकल्प) और ब्राउज़र के त्रुटि कंसोल में मुझे त्रुटि मिलती है "दस्तावेज़ शून्य है"। जब मैं soapclient.js में req.responseXML के मान को लॉग करता हूं, तो मुझे लगता है कि यह शून्य है।

क्या कोई इस बात पर सलाह दे सकता है कि क्या गलत हो रहा है और मुझे इसे काम करने के लिए क्या करना चाहिए?

+0

जब मैं ग्लासफ़िश में वेब सेवा को तैनात करता हूं, क्लाइंट को jqSOAPClient.js के मामले में "अनिर्धारित" मिलता है और soapclient.js का उपयोग करते समय शून्य)। – bgh

उत्तर

2

मुझे पता चला कि यहां क्या हो रहा था। यह धागा जैसा ही है: jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox

असल में मैं फ़ायरफ़ॉक्स का उपयोग कर रहा हूं और जब कोई एक क्रॉस डोमेन कॉल कर रहा है (वेब ​​सेवा के पते का डोमेन वेब पेज के डोमेन के समान नहीं है) तो फ़ायरफ़ॉक्स से AJAX का उपयोग करके, फ़ायरफ़ॉक्स पहले एक विकल्प भेजता है HTTP सेवा (इससे पहले पोस्ट संदेश प्रसारित करने से पहले), वेब सेवा से निर्धारित करने के लिए यदि कॉल की अनुमति दी जानी चाहिए या नहीं। तब वेब सेवा को यह विकल्प यह बताने के लिए जवाब देना चाहिए कि क्या यह अनुरोध आने की अनुमति देता है या नहीं।

अब, जेएक्स-डब्ल्यूएस ("HTTP विधि को संभाल नहीं सकता: विकल्प") से चेतावनी बताती है कि यह किसी भी विकल्प HTTP-संदेशों को संभाल नहीं पाएगा। यह ठीक है - अंततः वेब सेवा ग्लासफ़िश पर चली जाएगी। सवाल यह है कि मैं विकल्प संदेश का जवाब देने के लिए ग्लासफ़िश को कैसे कॉन्फ़िगर कर सकता हूं।

धागा जुहा ऊपर संदर्भित में कहता है कि वह Django में निम्न कोड का उपयोग करता है:

def send_data(request): 
    if request.method == "OPTIONS": 
     response = HttpResponse() 
     response['Access-Control-Allow-Origin'] = '*' 
     response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
     response['Access-Control-Max-Age'] = 1000 
     response['Access-Control-Allow-Headers'] = '*' 
     return response 
    if request.method == "POST": 
     # ... 

पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति एक पैटर्न जो इंगित करता है जो मूल (प्राप्तकर्ता के पते) स्वीकार किया जाएगा देता है (मेरा किसी भी मूल की अनुमति देने से थोड़ा अधिक सख्त हो सकता है) और एक्सेस-कंट्रोल-मैक्स-एज बताता है कि क्लाइंट को फिर से अनुमति के लिए कितने सेकंड का अनुरोध करना होगा।

मैं ग्लासफ़िश में यह कैसे कर सकता हूं?

+0

उहम, मदद? किसी को? – bgh

+0

मैंने सर्वर पर प्रॉक्सी PHP वेब सेवा चलाकर क्रॉस-डोमेन वेब सेवा कॉल से बचने का निर्णय लिया है जिस पर वेब साइट होस्ट की गई है। जावास्क्रिप्ट इस PHP वेब सेवा को कॉल करता है और PHP स्क्रिप्ट लक्ष्य वेब सेवा के अनुरोधों को आगे बढ़ाता है। – bgh

1

क्या आपने वास्तव में परीक्षण किया है कि ws ठीक से काम कर रहा है?
आप अनुरोध/प्रतिक्रिया आदि का निरीक्षण करने के लिए सोपूआई का उपयोग कर सकते हैं जब आप पुष्टि करते हैं कि एसओएसयूयूआई से काम कर रहा है, तो निरीक्षण करें कि कच्चे साबुन संदेश का प्रारूप क्या है। फिर जांचें कि .js विधि के साथ भेजने से पहले यह कैसा दिखता है, और उनकी तुलना करें।

यह आपको गलत समझने में मदद कर सकता है।

+0

सुझाव के लिए धन्यवाद। वेब सेवा साबुनयूआई से ठीक काम करती है। मैंने jqSOAPClient द्वारा भेजे गए अनुरोध के विरुद्ध सोपयूआई द्वारा भेजे गए अनुरोध की सामग्री की तुलना की है। soapUI: – bgh

+0

अनुरोध नीचे दिए गए हैं ' बर्नहार्ड ' jqSOAPClient: ' बर्नहार्ड ' – bgh

+0

वहाँ मामूली अंतर हैं, लेकिन मैं उनका मानना ​​है कि ' दोनों सही हो। मैंने अनुरोध किया है कि साबुनयू भेजता है और इसे jqSOAPClient.js में हार्ड-कोड किया जाता है ताकि वह ठीक उसी स्ट्रिंग को भेज सके लेकिन वेब सेवा अभी भी चेतावनियां देती है '24 मार्च 2011 2:36:32 अपराह्न com.sun.xml .ws.transport.http.server.WSHttp हैंडलर हैंडल एक्सचेंज चेतावनी: HTTP विधि को संभाल नहीं सकता: विकल्प ' और कोई प्रतिक्रिया नहीं। जब मैं साबुन का उपयोग करता हूं तो वेब विधि निष्पादित होती है, लेकिन वेब पेज से कॉल होने पर यह बिल्कुल नहीं चलती है। – bgh

0

चेक अगर यह मदद करता है
http://bugs.jquery.com/attachment/ticket/6029/jquery-disable-firefox3-cross-domain-magic.patch

यह अमान्य के रूप में
http://bugs.jquery.com/ticket/6029
रूप में चिह्नित है, लेकिन यह आप कुछ संकेत

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

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