navid rezadoost
navid rezadoost
خواندن ۵ دقیقه·۴ سال پیش

کار با api تدبیر پرداز در NodeJs


خب قبل شروع کردن اول یه سری توضیح میدم در مورد اینکه چی شد که با این api رو به رو شدم (میتونید از این بخش بگذرید.)


حدودا شش ماه پیش بود پروژه ای با محوریت سبدگردانی بورس رو استارت زدم.

همه چی خوب بود تا روزی که شروع به کار با کردن با api SOAP خود تدبیر پرداز رو به رو شدم.
یه داکیومنت دستم بود که فقط کسی میفهمیدش که قبلا با این API SOAP خود تدبیر کار کرده باشه نه کسی که اولین برخوردش رو با یه سرویس SOAP تجربه کرده باشه.

چند نکته قبل از اینکه هر گونه تلاشی برای کار با تدبیر باید کاملا ازش مطمئن بشید:

  • بررسی کنید که تدبیر ip تون رو در White list قرار داده باشه. دقت کنید که اگر با تلفن موبایل دارید ب این سرویس کار میکنید به طور کامل بی خیال بشید بهترین کار استفاده از ip استاتیک ADSL خونه تون هست.
  • کار با بعضی از api های این سرویس White list های مجزا با تمام سرویس داره پس اگه ریکوئست تون توی Waiting قفل کرد شک نکنید تدبیر ip شما رو در White list نداره در نتیجه دیتایی هم در کار نیست.

اگر خطایی تحت عنوان باکس پایین دیدید یعنی 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(&quotxml2js&quot).parseString; let token; let loginXML = `<s:Envelope xmlns:s=&quothttp://www.w3.org/2003/05/soap-envelope&quot
xmlns:a=&quothttp://www.w3.org/2005/08/addressing&quot>
<s:Header>
<a:Action s:mustUnderstand=&quot1&quot>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=&quot1&quot> در اینجا ادرس سرویس رو با کوئری استرینگی که ته این نوشته گذاشتم قرار بده ?wsdl</a:To>
</s:Header>
<s:Body>
<Login xmlns=&quothttp://tempuri.org/&quot>
<username>نام کاربر شرکت</username>
<password>رمز عبور</password>
</Login>
</s:Body>
</s:Envelope>‍‍` axios.post(ادرس سرویسی که تدبیر برای ارسال درخواست بهتون داده , loginXML , { headers: {&quotContent-Type&quot: &quotapplication/soap+xml; charset=utf-8&quot }})
.then((getToken) => {
parseString(getToken.data , { mergeAttrs: true }, function (err, getToken) {
if (err) res.json({ msg: &quoterror when get login token&quot,status: res.statusCode, error: err});
token = getToken[&quots:Envelope&quot][&quots:Body&quot][0][&quotLoginResponse&quot][0][&quotLoginResult&quot][0][&quotb:Token&quot][0];
})
})
.catch((err) => res.json({ msg: &quoterror login tadbir&quot,status: res.statusCode,error: err}));


خب نوبتیم باشه باید از توکنی که در بالا گرفتیم استفاده کنیم و دیتای مورد نظر صندوق مون رو دریافت کنیم:

بازم به مقادیر بالا یعنی axios و xml2js نیاز داریم پس یادتون نره فراخونیش کنید!



حالا مثل بالا که توکن رو گرفتیم یک promise ساده مینویسیم و داده دریافتی مون رو اول تبدیل به json میکنیم حالا با تریس کردن json دریافتی در مسیری که در json برگشتی میبنید داده های مورد نیاز تون رو دریافت کنید و هر جور که باید در برنامه تون استفاده کنید.

خب تموم شد از اونجایی که در روشی که بتون معرفی کردم کثیف اری زیاد هست و شما فرایند دریافت توکن رو در کلیه فرایند کار با تدبیر دارید توصیه میکنم با دانش شی گرایی تون برای یک میکروسرویس خوب ایجاد کنید تا مدیریت کردن این فرایند ها براتون ساده تر بشه.

`

تدبیر
شاید از این پست‌ها خوشتان بیاید