PDA

View Full Version : سوال: خطای WSDL Untyped Array issue



یوسف زالی
سه شنبه 12 دی 1391, 11:53 صبح
سلام.
به نگاهی به این WSDL بندازید:
http://www.smsmelli.com/class/sms/webservice/server.php?wsdl

اگر با Importer ازش Interface بگیریم به مشکل Untyped Array بر می خوریم.
معمولا در وب سرویس های جدید بر مبنای جاوا این مشکل وجود داره.
راهی برای اصلاح WSDL به فرم Litteral وجود نداره.
حالا مشکل مزبور را چه کنیم دوستان؟
StackOverFlow هم ره به جایی نبرد.

BORHAN TEC
پنج شنبه 14 دی 1391, 13:23 عصر
سلام
بالاخره بعد از مدتی سر و کله زدن فهمیدم که راه حلش چیه(راه حلی که حتی هنوز هم در دلفی و RemObjects SDK وجود ندارد)!!! :لبخند:
با استناد به این صفحه:
https://devcentral.f5.com/community/group/aft/13265/asg/51
می توان متوجه شد که نوع داده Array در آن سند WSDL معادل یک آرایه دو بعدی است. این که همیشه معادل یک آرایه دو بعدی است را شکی ندارم ولی در مورد نوع داده ای(رشته ای، عددی یا ...) زیاد مطمئن نیستم که همیشه از نوع رشته ای است یا خیر و در این مورد خاص باید اعتراف کنم که بیلمیرم! :گیج:
ولی در آن یونیتی که دلفی اینترفیس مربوط به آن وب سرویس را Generate می کند به جای نوع داده Array کافی است که یک آرایه دو بعدی از String را قرار دهید.
مثال:
برای برطرف کردن مشکل این اینترفیس:
gwiPortType = interface(IInvokable)
['{09DD328D-8426-6DBF-5167-50355B33465C}']
function GetCredit: Array; stdcall;
function enqueue(const from: string; const rcpt_array: Variant;
const msg: Variant; const type_: string): Array; stdcall;
end;
اول باید یک نوع داده ای مثل این را تعریف کنید، که یک آرایه دو بعدی از رشته ها است:
type
T2dArray = array of array of string;
حال اینترفیس بالا را به شکل زیر تغییر دهید:
gwiPortType = interface(IInvokable)
['{09DD328D-8426-6DBF-5167-50355B33465C}']
function GetCredit: T2dArray; stdcall;
function enqueue(const from: string; const rcpt_array: Variant;
const msg: Variant; const type_: string): T2dArray; stdcall;
end;
حالا مشکل حل شده است و شما از اون وب سرویسی که معرفی کردید می توانید به این شکل استفاده کنید:
procedure TForm1.Button1Click(Sender: TObject);
var
res: T2dArray;
begin
res := GetgwiPortType().GetCredit;
ShowMessage(res[1, 0]);
ShowMessage(res[1, 1]);
// ShowMessage(res[x,y])
end;

من این روش را در مورد وب سرویسی که معرفی کردید تست کردم و واقعاً هم جواب گرفتم. این را هم بگویم که برای این کار از Delphi XE3 استفاده کردم، که فکر می کنم این روش در نسخه های دیگر هم بدون مشکل کار کند.:متفکر:

موفق و سربلند باشید...

یوسف زالی
جمعه 15 دی 1391, 22:55 عصر
شاهین جان اولا ممنون بابت توضیحات خوبی که دادی.
در ثانی یک سوال ثانویه برام بوجود اومد، شما یوزر و رمز عبور رو در HTTPRIO1.HTTPWebNode.UserName و HTTPRIO1.HTTPWebNode.Password گذاشتید، درسته؟

BORHAN TEC
جمعه 15 دی 1391, 23:01 عصر
من از یور و پسورد استفاده نکردم و فقط Casting اون نوع های داده ای رو انجام دادم که به خوبی هم جواب داد. برای نحوه استفاده بهتره که مستندات وب سرویس رو مطالعه کنید و یا اونها رو از شرکت مربوطه تهیه کنید.