خب قبل شروع کردن اول یه سری توضیح میدم در مورد اینکه چی شد که با این api رو به رو شدم (میتونید از این بخش بگذرید.)
حدودا شش ماه پیش بود پروژه ای با محوریت سبدگردانی بورس رو استارت زدم.
همه چی خوب بود تا روزی که شروع به کار با کردن با api SOAP خود تدبیر پرداز رو به رو شدم.
یه داکیومنت دستم بود که فقط کسی میفهمیدش که قبلا با این API SOAP خود تدبیر کار کرده باشه نه کسی که اولین برخوردش رو با یه سرویس SOAP تجربه کرده باشه.
چند نکته قبل از اینکه هر گونه تلاشی برای کار با تدبیر باید کاملا ازش مطمئن بشید:
اگر خطایی تحت عنوان باکس پایین دیدید یعنی xml ارسال به تدبیر از قوانین تدبیر پیروی نمیکنه:
<strong>:کاربر گرامی</strong><br><br>
.درخواست شما معتبر نمی باشد <br> لطفا از ابتدا داده های وارد شده را کنترل و یکبار دیگر سعی
نمایید<br>در صورتی که مجددا با این پیغام مواجه شدید، شماره پیگیری را یادداشت و با شرکت کارگزاری تماس حاصل فرمایید<br><br><font color=” Black”>
شماره پیگیری: 15087116414845950752</font>
<br><br><a href='();'>[برگشت]</a>
خب بهتره بریم سراغ اصل ماجرا و برای جا افتادن ماجرا api معمولی در در سرویس تدبیر پیاده سازی کنیم ما برای ارسال این درخواست از پکیج معروف axios استفاده میکنیم با استفاده از nodeJs
اول از همه با دستور زیر پکیج مون رو نصب میکنیم:
npm i axios
حالا وقت اون رسیده تان این پیکیج رو درون فایل مون فراخوانی کنیم:
const axios = require('axios');
از اونجایی که سرویس های SOAP با پرتوکل ارتباطی POST در کلاینت ها کار میکنن با استفاده از axios یک درخواست POST باید ایجاد کنیم قبل از هر چیز باید اشاره کنم تدبیر در هر ریکوئست یک بار از شما توکن را دریافت میکند پس قبل از فراخوانی (api getFundDetail) اول از همه باید توکنی از سرویس تدبیر دریافت کنیم
بریم شروع کنیم :)
یه توضیح مختصر در مورد کد زیر میدم:
خب اول axiso رو فراخونی میکنم و بعد یک متغییر میسازیم که فعلا مقداری نداره
در خط بعدی xml مورد نظرم رو داخل یک متغییر قرار میدم تا در زمان ارسال درخواستم بتونم با axios بفرستم سمت سرویس تدبیر پرداز داخل این xml مقادیری که براتون کامنت گذاشتم رو باید با دقت وارد کنید فقط ادرس سرویس تون و یوزر نیم و رمز عبور رو جا گذاری کنید داخل این xml
حالا axios رو فراخونی میکنم و بهش میگم متود درخواستم رو پست بگذاره و اول از همه ادرس سرویس و در قدم بعد xml رو که توی متغییر loginXML گذاشتم رو بهش پاس میدم و بعد از اون درخواستم رو تیو هدر دقیقا به شکل زیر وارد میکنم.
همون طور که میدونید پاسخ های سرویس های SOAP به صورت XML بر میگردن من اینو نمیخوام برای همین با استفاده از یک پیکج قدرتمند به نام xml2js میام و XML دریافتی خودم رو در پاسخ تدبیر به JSON تبدیل میکنم و به شکل زیر تریس میکنم تا به مقدار توکن دست پیدا کنم و بعد مقدارش رو میریزم توی همون متغییر توکنی که از اول ایجاد کردیم.
خب حالا توکن رو گرفتید یه نفس عمیق بکشید و با لذت به رسپانس خیره بشید :))
هر وقت اماده بودید بریم برای ارسال این توکن به تدبیر و دریافت دیتای getFundDetail
const axios = require('axios'); const parseString = require("xml2js").parseString; let token; let loginXML = `<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://tempuri.org/IHubService/Login</a:Action>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>
<a:To s:mustUnderstand="1"> در اینجا ادرس سرویس رو با کوئری استرینگی که ته این نوشته گذاشتم قرار بده ?wsdl</a:To>
</s:Header>
<s:Body>
<Login xmlns="http://tempuri.org/">
<username>نام کاربر شرکت</username>
<password>رمز عبور</password>
</Login>
</s:Body>
</s:Envelope>` axios.post(ادرس سرویسی که تدبیر برای ارسال درخواست بهتون داده , loginXML , { headers: {"Content-Type": "application/soap+xml; charset=utf-8" }})
.then((getToken) => {
parseString(getToken.data , { mergeAttrs: true }, function (err, getToken) {
if (err) res.json({ msg: "error when get login token",status: res.statusCode, error: err});
token = getToken["s:Envelope"]["s:Body"][0]["LoginResponse"][0]["LoginResult"][0]["b:Token"][0];
})
})
.catch((err) => res.json({ msg: "error login tadbir",status: res.statusCode,error: err}));
خب نوبتیم باشه باید از توکنی که در بالا گرفتیم استفاده کنیم و دیتای مورد نظر صندوق مون رو دریافت کنیم:
بازم به مقادیر بالا یعنی axios و xml2js نیاز داریم پس یادتون نره فراخونیش کنید!
حالا مثل بالا که توکن رو گرفتیم یک promise ساده مینویسیم و داده دریافتی مون رو اول تبدیل به json میکنیم حالا با تریس کردن json دریافتی در مسیری که در json برگشتی میبنید داده های مورد نیاز تون رو دریافت کنید و هر جور که باید در برنامه تون استفاده کنید.
خب تموم شد از اونجایی که در روشی که بتون معرفی کردم کثیف اری زیاد هست و شما فرایند دریافت توکن رو در کلیه فرایند کار با تدبیر دارید توصیه میکنم با دانش شی گرایی تون برای یک میکروسرویس خوب ایجاد کنید تا مدیریت کردن این فرایند ها براتون ساده تر بشه.
`