نمایش نتایج 1 تا 12 از 12

نام تاپیک: define new type

  1. #1

    define new type

    سلام من یه تابع دارم که آرایه ای از 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 رو چجوری تعریف کنم؟؟؟؟؟؟؟
    لطفا کمک کنید!!

  2. #2

    نقل قول: define new type

    این تابع geAllMessages آیا فقط یک آیتم (شامل سه فیلد errorNumber, RecipientName, SenderName) برمیگردونه، یا اینکه آرایه ایی از آیتم هایی را برمیگردونه که هر کدام این سه فیلد را دارند؟

    اگر فقط یک آیتم برگشت داده میشه که سه فیلد string داره، میشه خیلی راحت روی عناصر آرایه حرکت کرد، و هر عنصر Variant را به عنوان یک string خواند:

    var
    Element : Variant;
    Res := ArrayOf_xsd_anyType;
    begin
    for Elemenet in Res do
    ShowMessage(Elemenet);
    end;


    اما اگر اون آرایه، آرایه ایی از عناصری هست که هر کدام خودشان اشیائی هستند که اون سه فیلد را دارند، اون وقت کار سختر میشه. قاعدتا باید WSDL Importer اون ساختار داده را به صورت یک Complex type در نظر می گرفت، و یک کلاس مشتق شده از TRemotable، حاوی سه خصوصیت مورد نظر تعریف می کرد، و آرایه از نوع آن کلاس تعریف می شد.

    از چه نسخه ایی از دلفی استفاده می کنید؟ فایل کامل WSDL رو می تونید اینجا قرار بدید؟


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  3. #3

    نقل قول: define new type

    ضمن عرض تشکر از توجهتون....
    از دلفی 7 و WSDL importer خودش استفاده میکنم.

    ما اگر اون آرایه، آرایه ایی از عناصری هست که هر کدام خودشان اشیائی هستند که اون سه فیلد را دارند، اون وقت کار سختر میشه. قاعدتا باید WSDL Importer اون ساختار داده را به صورت یک Complex type در نظر می گرفت، و یک کلاس مشتق شده از TRemotable، حاوی سه خصوصیت مورد نظر تعریف می کرد، و آرایه از نوع آن کلاس تعریف می شد.
    درسته همون طور که گفتم تابع geAllMessages یه آرایه از آبجکتهارو برمیگردونه مثلا ممکنه 10 تا پیام جدید داشته باشیم که بخوایم دریافتشون کنیم میتونم دومین پارامتر تابع رو که عدد صحیح است 10 بدیم ولی چون نمیدونیم ممکنه چند تا پیام یا اس ام اس جدید داشته باشیم هر بار با 1 این تابع رو صدا میزنیم بعد یا میزاریم تو while یا با timer پیامهای جدید رو دریافت میکنیم حالا اگه اینجوری صدا بزنیم یه آرایه ازهمون نوعی که بالا تو Xml response میبینید برمیگردونه حالا چه یه پیام بگیریم با پارامتر numberOfMessages=1 یه آرایه 1 عنصری برمیگردونه یا اگر با پارامتر numberOfMessages=10
    صدا بزنیم یه آرایه 10 عنصری از نوعی که گفتم برمیگردونه و مشکل منم
    سر همینه که باید ComplexType رو چطوری تعریف کنم؟؟؟

    پس چرا این ساختارو به صورت variant یا array of variant گرفته؟؟؟؟؟؟؟


    با اون TRemotable که گفتی دیروز نوشتم یعنی این کار میکنه ::
    IncomingFormat = class(TRemotable)

    private
    S_Body : WideString;
    S_ErrorResult : WideString;
    S_RecipientNumber : WideString;
    S_SenderNumber : WideString;

    published
    property body : WideString
    read S_Body;
    property errorResult : WideString
    read S_ErrorResult;
    property recipientNumber : WideString
    read S_RecipientNumber;
    property senderNumber : WideString
    read S_SenderNumber;
    end;

    ArrayOf_xsd_anyType = array of IncomingFormat;
    راستش من دلفی زیاد کار نکردم نحوه تعریف این رو هم از DelphiGroup پیدا کردم!!!
    فایل WSDl مگفا رو هم که گفتی attach کردم...
    فایل های ضمیمه فایل های ضمیمه

  4. #4

    نقل قول: define new type

    پس چرا این ساختارو به صورت variant یا array of variant گرفته؟
    خب، با این WSDL، مشکل از دلفی نیست. در WSDL یک نوع xsd:anyType داریم، که در سند توضیح WSDL فقط یک بار بهش اشاره شده. توضیحی هم که درباره اش داده شده، این هست:
    Use the xsd:anyType type to represent a field/parameter which can have any type.
    xsd:anyType تعریف مشخصی نداره، و هر زبان برنامه نویسی ممکنه اون رو به شکل خاصی پیاده سازی کنه. در سند WSDL شما، اون ساختار سه فیلدی که کد خطا، نام فرستنده، و نام گیرنده را در بر میگیره، تعریف نشده، و آرایه ایی هم که در WSDL تعریف شده، آرایه ایی از xsd:anyType هست. مقدار خروجی تابع GetAllmessages هم همین نوع آرایه هست. یعنی در داخل WSDL اشاره ایی نشده که این داده ایی که به صورت anyType تعریف شده، واقعا ساختارش و محتواش چی هست. پس دلفی هیچ اطلاعی از ساختار این داده نداره. عمومی ترین حالتی که دلفی میتونه برای یک داده با هر نوعی (any type) در نظر بگیره، Variant هست. برای همین هم اون رو به صورت array of variant تعریف کرده، که درست هست.

    اگر ساختار داده مربوطه در WSDL شما تعریف شده بود، ولی دلفی آن را خودش بدون توجه به اون تعریف، تبدیل به array of variant می کرد، اون وقت اشتباه از دلفی بود، ولی اینجا در خودِ WSDL شما هم چیزی ذکر نشده.

    معمولا توصیه میشه که از نوع xsd:anyType استفاده نشه، چون استفاده از آن مستلزم این هست که به برنامه نویس، جدای از تعاریف WSDL، گفته بشه که باید با این داده به چه شکلی برخورد کنه، چون از روی خود WSDL با این تعریف نمیشه این مسئله رو متوجه شد.

    یک احتمال که من میدم این هست که این داده برگشتی خودش یک سند XML باشه، و برای همین به صورت xsd:anyType تعریف شده. این رو میشه با بررسی SOAP Message دریافتی حاصل از فراخوانی آن تابع بررسی کرد، و دید که با فراخوانی آن تابع، دقیقا چه داده ایی از سرور به کلاینت ارسال میشه. اگر داده دریافتی XML باشه، می تونید با کدی مشابه کدی که در پست قبلی قرار دادم، محتوای آن را به صورت آرایه ایی از string بخونید، و همه محتوا را به صورت یک string که حاوی یک سند XML هست، در بیارید، و سپس اون XML را Parse کنید.
    اگر XML نیست، ببینید شرکت ارائه کننده سرویس چه توضیحی درباره خروجی این تابع داده، یا اگر مثالی از چگونگی استفاده از آن در سیار زبان ها ارائه کرده، در کد آن زبان ها، با این داده ناشناخته چطور برخورد شده، شما هم همان رفتار را در دلفی پیاده سازی کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  5. #5

    نقل قول: define new type

    این یه نمونه از XML Soap Response که گفتی تویه php :


    *****ًٍREQUEST

    POST /services/urn:SOAPSmsQueue HTTP/1.0
    Host: webservice.magfa.com
    User-Agent: NuSOAP/0.7.1 (1.1)
    Content-Type: text/xml; charset=UTF-8
    SOAPAction: ""
    Authorization: Basic "SENSORED by sina"
    Content-Length: 632

    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:impl="http://magfa.com/soap/SOAPSmsQueue">
    <SOAP-ENV:Body>
    <impl:getAllMessages xmlns:impl="http://magfa.com/soap/SOAPSmsQueue">
    <domain xsi:type="xsd:string">magfa</domain>
    <numberOfMessages xsi:type="xsd:int">2</numberOfMessages>
    </impl:getAllMessages>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>


    *****Response
    HTTP/1.1 200 OK
    Date: Mon, 14 Jun 2010 16:09:14 GMT
    Server: Apache-Coyote/1.1
    Content-Type: text/xml;charset=utf-8
    Via: 1.0 sms.magfa.com
    Connection: close

    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
    <ns1:getAllMessagesResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://magfa.com/soap/SOAPSmsQueue">
    <ns1:getAllMessagesReturn xsi:type="soapenc:Array" soapenc:arrayType="ns2:CustomerReturnIncomingForma t[2]" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="urn:SOAPSmsQueue">
    <item href="#id0"/>
    <item href="#id1"/>
    </ns1:getAllMessagesReturn>
    </ns1:getAllMessagesResponse>
    <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>
    <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns4:CustomerReturnIncomingFormat" xmlns:ns4="urn:SOAPSmsQueue" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
    <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>
    </soapenv:Body>
    </soapenv:Envelope>Result

    Array
    (
    [0] => Array
    (
    [0] => Array
    (
    [body] => 0
    [errorResult] =>
    [recipientNumber] => 98300097500072
    [senderNumber] => 989187082367
    )

    [1] => Array
    (
    [body] => 0
    [errorResult] =>
    [recipientNumber] => 98300097500072
    [senderNumber] => 989187082367
    )

    )

    )
    همینطور که میبینی اینجا دو تا اس ام اس رو دریافت کرده !!!
    اینم کد php من نمیدونم گیج شدم نمیدونم چیکار کنم!!!



    <?php

    require_once('lib/nusoap.php');

    $username = 'xxx';
    $password = 'xxx';

    $domain = 'magfa';
    $count=1;


    // Connect ...
    $client = new soapclient_nu('http://webservice.magfa.com/services/urn:SOAPSmsQueue?wsdl', 'wsdl');

    // Read error
    $err = $client->getError();
    if ($err)
    {
    echo "<h2>Constructor error</h2><pre>$err</pre>";
    }

    // Authentication
    $client->setCredentials($username, $password, 'basic');

    /************************************************** ************
    * Send SMS (Example: sending multipart sms to a number) *
    * Please refer to web service document for parameter details *
    ************************************************** ************/


    $result[] = $client->call("getAllMessages",array($domain,2));


    // Display the request and response
    echo '<h2>Request</h2>';
    echo '<pre>' . str_replace("&gt;&lt;", "&gt;\n&lt;", htmlspecialchars($client->request, ENT_QUOTES)) . '</pre>';
    echo '<h2>Response</h2>';
    echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';

    // Check for a fault
    if ($client->fault)
    {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
    }
    else
    {
    // Check for errors
    $err = $client->getError();
    if ($err)
    {
    // Display the error
    echo '<h2>Error</h2><pre>' . $err . '</pre>';
    }
    else
    {
    // Display the result
    echo '<h2>Result</h2><pre>';
    print_r($result);
    echo '</pre>';
    }
    }
    ?>

    ]




  6. #6

    نقل قول: define new type

    خب، اگر کد نوشته شده در پست شماره 2 تاپیک را اجرا کنید، چه نتیجه ایی حاصل میشه؟

    اگر به جای
    ShowMessage(Element) 
    در اون کد، از
    ShowMessage(Element.senderNumber) 
    استفاده کنید، چطور؟


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  7. #7

    نقل قول: define new type

    ضمن عرض تشکر از آقای کشاورز بالاخره مشکلم حل شد و بادقت در فایل WSDL تونستم نوع جدید رو از کلاس TRemotable مشتق کنم و بنویسم بازم ازتون ممنونم!!

  8. #8
    کاربر تازه وارد آواتار 0armin0
    تاریخ عضویت
    شهریور 1385
    محل زندگی
    ایران
    پست
    43

    نقل قول: define new type

    لطفا کد دریافت پیامک از مگفا رو قرار بدید

  9. #9

    دريافت كمك از آقاي SINA

    با سلام خدمت آقاي سينا من دقيقا همين مشكل شما رو دارم اگه ممكنه اون كدي كه مشكل رو حل كرد برام بفرستيد ممنون مي شم.

  10. #10
    کاربر دائمی آواتار tadeh2010
    تاریخ عضویت
    آذر 1389
    محل زندگی
    تهران
    پست
    109

    نقل قول: define new type

    سلام

    خوب معلومه این بابا که این همه کار کرده نمیاد کدش رو همینطوری بزاره تو وب برای من و شما.
    منم منتظرم ولی برنامه نویسای کمی مثل آقای کشاورز میان برای بالا بردن سطح علمی خودشون با بقیه کاربران هم راستا می شوند(با هم جستجو و فکر می کنند) تا مشکل حل شود.

  11. #11

    نقل قول: define new type

    function TForm1.Send():boolean;
    var
    SendResult : return_type;
    sm : sendwsdlPortType;
    Ninfo:numberInf;
    RecArr:ArrayOf_xsd_string;
    a:integer;
    b:Longint;
    mess:WideString;
    SL: TStringList;
    begin
    a:=0;
    Ninfo:=numberInf.Create;
    Ninfo.username:='****';
    Ninfo.password:='*********';
    Ninfo.number:='********************';

    SetLength(RecArr,1);
    RecArr[0]:='0912*******';
    SL := TSTringList.Create;
    SL.Values['text'] :=AnsiToUtf8(memo2.Text);



    try
    //SM := (soap1 as sendwsdlPortType).send_method(RecArr,mess,Ninfo,a) ;
    SendResult:=return_type.Create;
    //b:=SendResult.sms_id;
    SendResult:=(soap1 as sendwsdlPortType).send_method(RecArr,SL.Values['text'],Ninfo,a);
    ShowMessage(inttostr(SendResult.send_status)+','+I ntToStr(SendResult.send_amount));
    Result := True;
    except
    Result := False;
    end;
    end;

  12. #12
    کاربر تازه وارد
    تاریخ عضویت
    اردیبهشت 1385
    پست
    41

    نقل قول: define new type

    سلام دوستان
    من می خوام از یک وب سرویس تو دلفی جهت دریافت اس ام اس استفاده می کنم ولی متاسفانه وقتی فراخوانی می کنم null بر می گردونه و همین رو وقتی تو دات نت اجرا می کنم مقادیر رو بصورت صحیح بر می گردونه نمونه کدی که استفاده کردم رو در ادامه میزارم ببینید آیا کدم مشکل داره؟
    این وب سرویسم هست
    البته اونجاهایی که * دار هست رو خودم اضافه کردم چون نوع خروجی متد اس ام اس های دریافتی فقط TRemotable بود




    unit smsService;

    interface

    uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns, DBTables;

    type


    ReceiveSmsResult = class; { "http://tempuri.org/" }


    ArrayOfString = array of WideString; { "http://tempuri.org/" }
    ArrayOfLong = array of Int64; { "http://tempuri.org/" }
    ArrayOfInt = array of Integer; { "http://tempuri.org/" }


    // ************************************************** ********************** //
    // Namespace : http://tempuri.org/
    // ************************************************** ********************** //

    ReceiveSmsResult = class(TRemotable)
    private
    *** Order: Integer;
    *** SmsNumber: WideString;
    *** SmsDesc: WideString;
    *** GetId : Int64;
    *** FromNumber : WideString;
    *** ReceiveDate : TXSDateTime;
    *** SrDate : TXSDateTime;
    public
    *** destructor Destroy; override;
    published
    *** property POrder: Integer read Order;// write SetOrder;
    *** property PSmsNumber: WideString read SmsNumber;// write SetSmsNumber;
    *** property PSmsDesc: WideString read SmsDesc;// write SetSmsDesc;
    *** property PGetId: Int64 read GetId;// write SetPGetId;
    *** property PFromNumber: WideString read FromNumber;// write SetPFromNumber;
    *** property PReceiveDate: TXSDateTime read ReceiveDate;// write SetPReceiveDate;
    *** property PSrDate: TXSDateTime read SrDate;// write SetPSrDate;
    end;

    ArrayReceiveSmsResult = array of ReceiveSmsResult;

    // ************************************************** ********************** //
    // Namespace : http://tempuri.org/
    // soapAction: http://tempuri.org/%operationName%
    // transport : http://schemas.xmlsoap.org/soap/http
    // binding : ServiceSoap
    // service : Service
    // port : ServiceSoap
    // URL : http://mehrafraz.com/webservice/Service.asmx
    // ************************************************** ********************** //
    ServiceSoap = interface(IInvokable)
    ['{77573149-9C57-FA51-F11F-EFD527C91BD9}']
    function KillOMobile(const cCommand: WideString): Integer; stdcall;
    function KillProccess(const cCommand: WideString): Integer; stdcall;
    function checkSendEmailToServer: Boolean; stdcall;
    function GetEmails: Boolean; stdcall;


    function ReceiveSms(const
    cUserName: WideString; const
    cPassword: WideString; const
    lReceiveAllmsg: Boolean; const
    cDomainName: WideString; const
    cFromnumber: WideString): ReceiveSmsResult; stdcall;

    end;

    function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ServiceSoap;


    implementation

    function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
    const
    defWSDL = 'http://xxxraz.com/webservice/Service.asmx?WSDL';
    defURL = 'http://xxxz.com/webservice/Service.asmx';
    defSvc = 'Service';
    defPrt = 'ServiceSoap';
    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;
    RIO.HTTPWebNode.UseUTF8InHeader := true; //????,????UTF-8????
    RIO.Converter.Encoding:='UTF-8';

    try
    Result := (RIO as ServiceSoap);
    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;

    destructor ReceiveSmsResult.Destroy;
    var
    I: Integer;
    begin
    if Assigned(SrDate) then
    SrDate.Free;
    inherited Destroy;
    end;

    initialization
    InvRegistry.RegisterInterface(TypeInfo(ServiceSoap ), 'http://tempuri.org/', 'utf-8');
    InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Ser viceSoap), 'http://tempuri.org/%operationName%');
    InvRegistry.RegisterInvokeOptions(TypeInfo(Service Soap), ioDocument);
    RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfSt ring), 'http://tempuri.org/', 'ArrayOfString');
    RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfLo ng), 'http://tempuri.org/', 'ArrayOfLong');
    RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfIn t), 'http://tempuri.org/', 'ArrayOfInt');
    RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayRece iveSmsResult), 'http://tempuri.org/', 'ArrayReceiveSmsResult');
    RemClassRegistry.RegisterXSClass(ReceiveSmsResult, 'http://tempuri.org/', 'ReceiveSmsResult');

    //RemClassRegistry.RegisterXSClass( IncomeFormat, 'http://tempuri.org/', 'ReceiveSmsResult');


    end.




    و کدی که با اون فراخونیش کردم »:




    procedure TForm1.btn1Click(Sender: TObject);
    var
    objAllMsg : array[0..0] of ReceiveSmsResult;
    begin
    objAllMsg[0] := GetServiceSoap.ReceiveSms('test', 'test2', true, 't', '3000330000');
    end;



    ولی متاسفانه خروجی Null هستش یعنی مقادیر تک تک خونه هایی که تو آرایه هست یا صفره یا نال!!!!

    به نظرتون کجای کارم مشکل داره؟ یا می تونه مشکل از وب سرویس باشه با توجه به اینکه همین سرویس تو دات نت تست کردم درسن عمل می کرد و یک دیتا تیبل بر می گردوند؟؟؟؟؟؟

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •