PDA

View Full Version : دریافت اطلاعات از وب سرویس asp.net asmx توسط php



a1994n1373
جمعه 17 مهر 1394, 02:57 صبح
سلام دوستان . من یه وب سرویس خارجی دارم به ادرس http://ota.acerentacar.com/Arac/RateService.asmx
حالا میخوام از متد VehAvailRate (http://ota.acerentacar.com/Arac/RateService.asmx?op=VehAvailRate) در php استفاده کنم .

طبق اموزش هایی که خوندم این متد باید یه سری پارامترها بگیره و یه سری پارامترها برگردونه . اما نمیدونم اسم این پارامتر هارو از کجا بیارم و چطوری تو php استفاده کنم .
کدی که در حال حاضر دارم تو php اینه :



<?php
require 'lib/nusoap.php';
$client = new SoapClient("http://ota.acerentacar.com/Arac/RateService.asmx?WSDL");
$param = array('VehAvailRateSoapIn','xantia');
$result = $client -> VehAvailRate($param);


echo $result -> VehAvailRateResult;
?>


استادان محترم ممنون میشم راهنمایی بفرمایین .

a1994n1373
جمعه 17 مهر 1394, 10:53 صبح
یعنی بین اینهمه کاربر هیشکی نمیتونه کار مارو راه بندازه ؟؟؟؟ مرسی واقعا !!!

djtrex
شنبه 18 مهر 1394, 14:56 عصر
سلام دوستان . من یه وب سرویس خارجی دارم به ادرس http://ota.acerentacar.com/Arac/RateService.asmx
حالا میخوام از متد VehAvailRate (http://ota.acerentacar.com/Arac/RateService.asmx?op=VehAvailRate) در php استفاده کنم .

طبق اموزش هایی که خوندم این متد باید یه سری پارامترها بگیره و یه سری پارامترها برگردونه . اما نمیدونم اسم این پارامتر هارو از کجا بیارم و چطوری تو php استفاده کنم .
کدی که در حال حاضر دارم تو php اینه :





<?php
require 'lib/nusoap.php';
$client = new SoapClient("http://ota.acerentacar.com/Arac/RateService.asmx?WSDL");
$param = array('VehAvailRateSoapIn','xantia');
$result = $client -> VehAvailRate($param);


echo $result -> VehAvailRateResult;
?>


استادان محترم ممنون میشم راهنمایی بفرمایین .

متدی که نیاز دارید استفاده کنید هم برای درخواست و هم پاسخ از ساختار پیچیده تو در تو استفاده کرده است. در نتیجه برای زبان هایی مثل php,js,ruby,... که strictly typed نیستن پیچیدگی پیاده سازی بیشتری دارید. (و برای همین پیچیدگی های soap/wsdl هست که شرکت های بزرگی مثل گوگل هم اون رو منسوخ کرده اند!)

اما راه حل:

اول از همه باید ببینید ساختار درخواست و پاسخ این متد چگونه است برای اینکار میتونید از wsdl اون یا از طریق php اینکارو انجام داد:
http://ota.acerentacar.com/Arac/RateService.asmx?WSDL

135907


از روی خصیصه type میشه فهمید که با یک ساختار پیچیده تو در تو طرف هستید!

برای جزییات بیشتر از php استفاده میکنیم:



<?php


$soap = new SoapClient('http://ota.acerentacar.com/Arac/RateService.asmx?WSDL');


print_r($soap->__getFunctions());
print_r($soap->__getTypes());



من از دو متد getFunctions (http://php.net/manual/en/soapclient.getfunctions.php) و getTypes (http://php.net/manual/en/soapclient.gettypes.php) استفاده کردم که متد ها و آبجکت های سرویس رو نشون میده.
امضای متد مورد نیاز شما:


OTA_VehAvailRateRS VehAvailRate(OTA_VehAvailRateRQ $Request)


و ساختار درخواست:



struct OTA_VehAvailRateRQ {
ArrayOfSourceType POS;
UniqueID_Type CustomerID;
VehAvailRQCore VehAvailRQCore;
VehicleAvailRQAdditionalInfoType VehAvailRQInfo;
string EchoToken;
dateTime TimeStamp;
anonymous14 Target;
string TargetName;
string Version;
string TransactionIdentifier;
nonNegativeInteger SequenceNmbr;
anonymous15 TransactionStatusCode;
boolean RetransmissionIndicator;
string CorrelationID;
language PrimaryLangID;
language AltLangID;
string ReqRespVersion;
positiveInteger MaxResponses;
boolean MaxPerVendorInd;
}


بعضی نوع های ساده مثل string,boolean و ... هست و بعضی ساختارهای پیچیده تری مثل ArrayOfSourceType که به صورت تو در تو هستند.

حالا چند راه دارید.

۱. استفاده از ارایه های تو در تو:
https://www.drupal.org/node/2256251

۲. استفاده از StdClass :
https://www.drupal.org/node/2256251

۳. استفاده از SoapVar
http://php.net/manual/en/soapvar.soapvar.php

4. استفاده از ClassMap:
در این روش مثل C#‎‎‎‎‎‎‎ یا Java می تونید برای هر ساختارتون یه class بسازید و اونو به عنوان classmap به SoapClient بدید:



class MyBook {
public $title;
public $author;
}


$server = new SoapClient("http://example.com/webservice?wsdl", [
'classmap' => [
'book' => "MyBook"
]
]);


اطلاعات بیشتر:
http://pookey.co.uk/wordpress/archives/78-using-the-classmap-with-soap-in-php

۵. استفاده از پکیج phpro/soap-client برای تولید اتوماتیک classmap و type ها
اگر سرویس ساده ای داشته باشید ساخت این classmap ها راحت هست اما وقتی پیچیده بشه خیلی کار زمان بری هست و احتمال خطا توش زیاد هست.
می تونید از پکیج زیر استفاده کنید و با یک دستور کلاس ها و classmap رو ایجاد کنید. البته صرفا برای ساخت classmap نیست و امکان استفاده از سرویس و ایجاد کلاینت هم داره.
لینک پکیچ +‌ مستندات:
https://github.com/phpro/soap-client

مثلا من با دستور زیر تمام کلاس های این سرویس رو ایجاد کردم:


vendor/bin/soap-client generate:types --wsdl="http://ota.acerentacar.com/Arac/RateService.asmx?wsdl" ./types


(تو سیستم عامل های مختلف ممکنه کمی فرق کنه + از composer (https://getcomposer.org/) باید استفاده کنید)

مثلا کلاس OTA_VehAvailRateRQ که در بالا هم اشاره شد:



<?php


class OTA_VehAvailRateRQ
{


/**
* @var ArrayOfSourceType
*/
protected $POS;


/**
* @var UniqueID_Type
*/
protected $CustomerID;


/**
* @var VehAvailRQCore
*/
protected $VehAvailRQCore;


/**
* @var VehicleAvailRQAdditionalInfoType
*/
protected $VehAvailRQInfo;


/**
* @var string
*/
protected $EchoToken;


/**
* @var \DateTime
*/
protected $TimeStamp;


/**
* @var anonymous14
*/
protected $Target;


/**
* @var string
*/
protected $TargetName;


/**
* @var string
*/
protected $Version;


/**
* @var string
*/
protected $TransactionIdentifier;


/**
* @var nonNegativeInteger
*/
protected $SequenceNmbr;


/**
* @var anonymous15
*/
protected $TransactionStatusCode;


/**
* @var bool
*/
protected $RetransmissionIndicator;


/**
* @var string
*/
protected $CorrelationID;


/**
* @var language
*/
protected $PrimaryLangID;


/**
* @var language
*/
protected $AltLangID;


/**
* @var string
*/
protected $ReqRespVersion;


/**
* @var positiveInteger
*/
protected $MaxResponses;


/**
* @var bool
*/
protected $MaxPerVendorInd;


}




و با دستور زیر classmap رو براتون میسازه:


vendor/bin/soap-client generate:classmap --wsdl="http://ota.acerentacar.com/Arac/RateService.asmx?wsdl"


برای این سرویس این رو خروجی میده (خلاصه شده!)


new ClassMapCollection([
// ...
new ClassMap('OTA_VehAvailRateRQ', \\OTA_VehAvailRateRQ::class),
new ClassMap('VehAvailRQCore', \\VehAvailRQCore::class),
new ClassMap('ArrayOfSourceType', \\ArrayOfSourceType::class),
new ClassMap('SourceType', \\SourceType::class),
new ClassMap('RequestorID', \\RequestorID::class),
new ClassMap('Position', \\Position::class),
new ClassMap('BookingChannel', \\BookingChannel::class),
new ClassMap('UniqueID_Type', \\UniqueID_Type::class),
// ...
]);


6. استفاده از پکیج های دیگه مثل Zend Soap و ...
https://packagist.org/search/?q=soap

a1994n1373
یک شنبه 19 مهر 1394, 18:56 عصر
داداش دستت درد نکنه که وقت گذاشتی جواب دادی ولی باورت میشه من هنوز سردرگمم و نمیدونم باید چیکار کنم ؟!!!با است

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

تنها چیزی هم که دارم همین وب سرویسه متاسفانه !!!

djtrex
یک شنبه 19 مهر 1394, 20:10 عصر
داداش دستت درد نکنه که وقت گذاشتی جواب دادی ولی باورت میشه من هنوز سردرگمم و نمیدونم باید چیکار کنم ؟!!!با است

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

تنها چیزی هم که دارم همین وب سرویسه متاسفانه !!!

شما نیاز به مستندات این وب سرویس دارید میتونید از خودشون درخواست کنید. در غیر این صورت تنها با WSDL اون باید به صورت صحیح و خطا کار کنید!
اگه حالت دوم رو انتخاب کردید اکستنشن کروم Wizdler (https://chrome.google.com/webstore/detail/wizdler/oebpmncolmhiapingjaagmapififiakb?hl=en) یا اپ دسکتاپ SoapUI (http://www.soapui.org/) ابزارهای خوبی برای تست هستند!