sina1370
پنج شنبه 10 تیر 1389, 11:51 صبح
سلام من یه تابع دارم که آرایه ای از object ها رو بر میگردونه البته با WSDl importer فایل type ها رو import ولی یه نوع جدید وجود داره که دلفی اونو تشخیص نمیده و از نوع variant تعریف کرده بعد تویه راهنمای وب سرویس گفته این تابع آرایه ای از object ها برمیگردونه که فرمتشو باید کاربر پیدا کنه و استفاده کنه اولا این unit ایمپورت شده است :
unit SOAPSmsQueue;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
// ************************************************** ********************** //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************** ********************** //
// !:string - "http://www.w3.org/2001/XMLSchema"
// !:int - "http://www.w3.org/2001/XMLSchema"
// !:long - "http://www.w3.org/2001/XMLSchema"
**** // !:anyType - "http://www.w3.org/2001/XMLSchema"
// !:float - "http://www.w3.org/2001/XMLSchema"
ArrayOf_xsd_string = array of WideString;
ArrayOf_xsd_int = array of Integer;
ArrayOf_xsd_long = array of Int64;
*** ArrayOf_xsd_anyType = array of variant;
// ************************************************** ********************** //
// Namespace : http://xxxx.com/soap/SOAPSmsQueue
// transport : http://schemas.xmlsoap.org/soap/http
// style : rpc
// binding : TSOAPSoapBinding
// service : SoapSmsQueuableImplementationService
// port : TSOAP
// URL : http://webservice.xxxx.com/services/urn:SOAPSmsQueue
// ************************************************** ********************** //
SoapSmsQueuableImplementation = interface(IInvokable)
['{9DBBFB75-511D-1D3D-5200-4133705D96F5}']
function enqueue(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long): ArrayOf_xsd_long; stdcall;
function getMessageId(const domain: WideString; const checkingMessageId: Int64): Int64; stdcall;
function getRealMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
*** function getAllMessagesWithNumber(const domain: WideString; const numberOfMessages: Integer; const destNumber: WideString): ArrayOf_xsd_anyType; stdcall;
function getCredit(const domain: WideString): Single; stdcall;
*** function getAllMessages(const domain: WideString; const numberOfMessages: Integer): ArrayOf_xsd_anyType; stdcall;
function enqueueWithGateway(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long; const gateway: WideString
): ArrayOf_xsd_long; stdcall;
function getMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
function getMessageStatus(const messageId: Int64): Integer; stdcall;
end;
function GetSoapSmsQueuableImplementation(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): SoapSmsQueuableImplementation;
implementation
function GetSoapSmsQueuableImplementation(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SoapSmsQueuableImplementation;
const
defWSDL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue?wsdl'; //argument sent to this wsdl url
defURL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue';
defSvc = 'SoapSmsQueuableImplementationService';
defPrt = 'TSOAP';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as SoapSmsQueuableImplementation);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(SoapSmsQueu ableImplementation), 'http://xxxx.com/soap/SOAPSmsQueue', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Soa pSmsQueuableImplementation), '');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_string), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_string');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_int), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_int');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_long), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_long');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
end.
مشکل من تو اون قسمت های * دار هستش یعنی من باید به جای
ArrayOf_xsd_anyType = array of variant;
یه نوع جدید تعریف کنم مثلا :
ArrayOf_xsd_anyType = array of incomingFormat;
ضمنا فرمت این آبجکت هم توی XML Response به این صورته :
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:CustomerReturnIncomingFormat" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns3="urn:SOAPSmsQueue">
<body xsi:type="xsd:string">0</body>
<errorResult xsi:type="xsd:string" xsi:nil="true"/>
<recipientNumber xsi:type="xsd:string">98300097500072</recipientNumber>
<senderNumber xsi:type="xsd:string">989187082367</senderNumber>
</multiRef>
یعنی 4 تا فیلد از نوع رشته ای برمیگردونه یه توضیح هم اینکه این تابع من که اسمش getAllMessages هست پیامک های دریافتی جدید رو تو یه آرایه از آبجکت با فرمت بالا برمیگردونه
body :widestring;
errorResult :widestring;
recipientNumber:widestring;
senderNumber :widestring;
حالا من باید این نوع جدید رو چه جوری تعریف کنم که وقتی اینجوری مینوسم خطا نگیره ::
ArrayOf_xsd_anyType = array of IncomingFormat;
var
a: ArrayOf_xsd_anyType ;
begin
a := SoapHttp1.getAllmessages('xxxx',1);
یعنی من incomingFormat رو چجوری تعریف کنم؟؟؟؟؟؟؟
لطفا کمک کنید!!
unit SOAPSmsQueue;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
// ************************************************** ********************** //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************** ********************** //
// !:string - "http://www.w3.org/2001/XMLSchema"
// !:int - "http://www.w3.org/2001/XMLSchema"
// !:long - "http://www.w3.org/2001/XMLSchema"
**** // !:anyType - "http://www.w3.org/2001/XMLSchema"
// !:float - "http://www.w3.org/2001/XMLSchema"
ArrayOf_xsd_string = array of WideString;
ArrayOf_xsd_int = array of Integer;
ArrayOf_xsd_long = array of Int64;
*** ArrayOf_xsd_anyType = array of variant;
// ************************************************** ********************** //
// Namespace : http://xxxx.com/soap/SOAPSmsQueue
// transport : http://schemas.xmlsoap.org/soap/http
// style : rpc
// binding : TSOAPSoapBinding
// service : SoapSmsQueuableImplementationService
// port : TSOAP
// URL : http://webservice.xxxx.com/services/urn:SOAPSmsQueue
// ************************************************** ********************** //
SoapSmsQueuableImplementation = interface(IInvokable)
['{9DBBFB75-511D-1D3D-5200-4133705D96F5}']
function enqueue(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long): ArrayOf_xsd_long; stdcall;
function getMessageId(const domain: WideString; const checkingMessageId: Int64): Int64; stdcall;
function getRealMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
*** function getAllMessagesWithNumber(const domain: WideString; const numberOfMessages: Integer; const destNumber: WideString): ArrayOf_xsd_anyType; stdcall;
function getCredit(const domain: WideString): Single; stdcall;
*** function getAllMessages(const domain: WideString; const numberOfMessages: Integer): ArrayOf_xsd_anyType; stdcall;
function enqueueWithGateway(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long; const gateway: WideString
): ArrayOf_xsd_long; stdcall;
function getMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
function getMessageStatus(const messageId: Int64): Integer; stdcall;
end;
function GetSoapSmsQueuableImplementation(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): SoapSmsQueuableImplementation;
implementation
function GetSoapSmsQueuableImplementation(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SoapSmsQueuableImplementation;
const
defWSDL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue?wsdl'; //argument sent to this wsdl url
defURL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue';
defSvc = 'SoapSmsQueuableImplementationService';
defPrt = 'TSOAP';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as SoapSmsQueuableImplementation);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(SoapSmsQueu ableImplementation), 'http://xxxx.com/soap/SOAPSmsQueue', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Soa pSmsQueuableImplementation), '');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_string), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_string');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_int), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_int');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_long), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_long');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
end.
مشکل من تو اون قسمت های * دار هستش یعنی من باید به جای
ArrayOf_xsd_anyType = array of variant;
یه نوع جدید تعریف کنم مثلا :
ArrayOf_xsd_anyType = array of incomingFormat;
ضمنا فرمت این آبجکت هم توی XML Response به این صورته :
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:CustomerReturnIncomingFormat" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns3="urn:SOAPSmsQueue">
<body xsi:type="xsd:string">0</body>
<errorResult xsi:type="xsd:string" xsi:nil="true"/>
<recipientNumber xsi:type="xsd:string">98300097500072</recipientNumber>
<senderNumber xsi:type="xsd:string">989187082367</senderNumber>
</multiRef>
یعنی 4 تا فیلد از نوع رشته ای برمیگردونه یه توضیح هم اینکه این تابع من که اسمش getAllMessages هست پیامک های دریافتی جدید رو تو یه آرایه از آبجکت با فرمت بالا برمیگردونه
body :widestring;
errorResult :widestring;
recipientNumber:widestring;
senderNumber :widestring;
حالا من باید این نوع جدید رو چه جوری تعریف کنم که وقتی اینجوری مینوسم خطا نگیره ::
ArrayOf_xsd_anyType = array of IncomingFormat;
var
a: ArrayOf_xsd_anyType ;
begin
a := SoapHttp1.getAllmessages('xxxx',1);
یعنی من incomingFormat رو چجوری تعریف کنم؟؟؟؟؟؟؟
لطفا کمک کنید!!