نوشته شده توسط
a1994n1373
سلام دوستان . من یه وب سرویس خارجی دارم به ادرس
http://ota.acerentacar.com/Arac/RateService.asmx
حالا میخوام از متد
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
از روی خصیصه type میشه فهمید که با یک ساختار پیچیده تو در تو طرف هستید!
برای جزییات بیشتر از php استفاده میکنیم:
<?php
$soap = new SoapClient('http://ota.acerentacar.com/Arac/RateService.asmx?WSDL');
print_r($soap->__getFunctions());
print_r($soap->__getTypes());
من از دو متد getFunctions و getTypes استفاده کردم که متد ها و آبجکت های سرویس رو نشون میده.
امضای متد مورد نیاز شما:
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/archiv...th-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 باید استفاده کنید)
مثلا کلاس 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