मैं डेल्फी एक्सई 2 का उपयोग काफी बड़ी एसओएपी सेवा के साथ संवाद करने के लिए कर रहा हूं। मैंने सफलतापूर्वक wsdl आयात किया है और सब कुछ ठीक काम कर रहा है। हालांकि, मैं खुद को बहुत सारे कोड लिख रहा हूं। मैं एक सामान्य विधि चाहता हूं जो मेरी वेब सेवा को कॉल करे। मुझे अपने कोड को मल्टीथ्रेड करना भी मुश्किल लगता है क्योंकि अब यह है, क्योंकि मुझे प्रत्येक प्रकार के कॉल के लिए इतना कोड लिखना है।गति से एक एसओएपी विधि को गतिशील रूप से आमंत्रित करना?
सप्ताहांत प्रोग्रामर के अधिक होने के नाते मैं डेल्फी के अंदर और बाहर महारत हासिल करने से बहुत दूर हूं, लेकिन मुझे लगता है कि मुझे कम से कम आरटीटीआई की उचित समझ है, जो मुझे विश्वास है कि मुझे जो चाहिए वह करने के लिए इस्तेमाल किया जाना चाहिए।
वेब सेवा में लगभग 700 विभिन्न विधियां हैं और यह काफी समस्या है। wsdl से उत्पन्न कोड के रूप में नीचे दी गई विधियों है:
function addPhone(const Params: addPhone): addPhoneResponse; stdcall;
function updatePhone(const Params: updatePhone): updatePhoneResponse; stdcall;
function getPhone(const Params: getPhone): getPhoneResponse; stdcall;
function removePhone(const Params: removePhone): removePhoneResponse; stdcall;
function listPhone(const Params: listPhone): listPhoneResponse; stdcall;
function addStuff(const Params: addStuff): addStuffResponse; stdcall;
function updateStuff(const Params: updateStuff): updateStuffResponse; stdcall;
...
... about 700 more of the above
मूल रूप से, वहाँ चीजों की लगभग 700 विभिन्न प्रकार है कि नियंत्रित किया जा सकता है, और वहाँ है जोड़ने, अपडेट मिलता है, हटाने और सूची-तरीकों उन सब के लिए । प्रत्येक कॉल के साथ, एक समान वर्ग होता है जिसे एसओएपी अनुरोध के पैरामीटर के रूप में उपयोग किया जाता है। जैसा कि आप ऊपर देख सकते हैं प्रतिक्रिया के लिए एक समान वर्ग भी है।
वर्गों की तरह कुछ (बहुत सरल) दिखेगा:
addStuff = class
private
FStuff: string;
published
property stuff: string Index (IS_UNQL) read FStuff write FStuff;
end;
तो जब मैं वेब सेवा मैं उदाहरण के लिए कर फोन:
procedure CreateStuff;
var
req: addStuff;
res: addStuffResponse;
soap: MyWebServicePort;
begin
// Use the function in the wsdl-generated code to create HTTPRIO
soap := GetMyWebServicePort(false,'',nil);
// Create Parameter Object
req := addPhone.Create;
req.stuff := 'test';
// Send the SOAP Request
res := soap.addStuff(req);
end;
(हाँ, मैं जानता हूँ कि मैं कोशिश करना चाहिए था .. अंत में और साथ ही मुफ्त में :-))
फिर, कोड में कहीं और मुझे एक अलग विधि कॉल करने की आवश्यकता है:
procedure listStuff;
var
req: listStuff;
res: listStuffResponse;
soap: MyWebServicePort;
begin
// Use the function in the wsdl-generated code to create HTTPRIO
soap := GetMyWebServicePort(false,'',nil);
// Create Parameter Object
req := listPhone.Create;
req.stuff := 'test2';
// Send the SOAP Request
res := soap.listStuff(req);
end;
चूंकि मुझे पता है कि पैरामीटर हमेशा एक नाम के साथ एक वर्ग है जो मैं कॉल करने के तरीके के बराबर है, मैं कॉल को गतिशील रूप से आमंत्रित करने के लिए नीचे मेटाकोड की तरह कुछ करने में सक्षम होना चाहता हूं।
procedure soapRequest(Param: Something; var Response: Something);
begin
soap := GetMyWebServicePort(false,'',nil);
Response := soap.DynamicInvoke(Param.ClassName, Param);
end
तो मैं कुछ ऐसा कर सकता है:: मैं इसे कुछ RTTI जादू की आवश्यकता है, लेकिन मैं एक तरह से यह करने के लिए खोजने के लिए सक्षम किया गया have'nt लगता
soapRequest(VarOfTypeAddStuff,VarOfTypeAddStuffResponse)
soapRequest(VarOfTypeListStuff,VarOfTypeListStuffResponse)
...
किसी को भी एक विचार है कैसे करता है मेरी webservice को कॉल सरलीकृत किया जा सकता है?
यह देखने के लिए कि किसी को भी इस तरह के साथ आता है दिलचस्प होगा, लेकिन मैं सिर्फ आवरण दिनचर्या लिखा था की तरह आप के लिए "छिपाएँ" विवरण है। – mj2008
@ दाहुक: बहुत अच्छी तरह से पहली पोस्ट लिखी गई। वोट दिया एसओ में आपका स्वागत है – RobertFrank