2013-08-08 2 views
1

Привет я новичок в веб-сервиса, в PHP с ниже кода я пытаюсь сделать запрос мыла, как показано ниже XML, но это говорит об ошибкеPHP NuSOAP - SOAP запрос не работает

HTTP Error: Unsupported HTTP response status 405 Method Not Allowed (soapclient->response has contents of the response)

Вопросы:

  1. Как передать заголовки?
  2. Как передать FetchCalendarRequest с запросом, как в XML?

Я использовал Nusoap здесь, но если у вас есть SOAP PHP-класс, оно также предлагается.

Мой код:

<?php 

require_once('../lib/nusoap.php'); 

$client = new nusoap_client("http://webservices.test.com/ows/5.1/Availability.wsdl"); 
$err = $client->getError(); 

if ($err) 
{ 
    client_debug_error_message('Constructor error', $err, $client); 
    exit; 
} 

// Call the SOAP method 
$result = $client->call(
    'FetchCalendar', 
    array(
     'StayDateRange' => array(
      'StartDate' => '2013-10-01', 
      'EndDate' => '2013-10-10', 
     ), 
    ), 
); 

// Check for a fault 
if ($client->fault) 
{ 
    debug_preformatted('Fault', $result); 
} 
else 
{ 
    // Check for errors 
    $err = $client->getError(); 

    if ($err) 
    { 
     debug_preformatted('Error', $err); 
    } 
    else 
    { 
     debug_preformatted('Result', $result); 
    } 
} 

// Display the request and response 
client_debug_dump($client); 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
    <OGHeader transactionID="005435" timeStamp="2008-12-09T13:26:56.4056250-05:00" xmlns="http://webservices.test.com/og/4.3/Core/"> 
     <Origin entityID="OWS" systemType="WEB" /> 
     <Destination entityID="WEST" systemType="ORS" /> 
    </OGHeader> 
    </soap:Header> 
    <soap:Body> 
    <FetchCalendarRequest xmlns:a="http://webservices.test.com/og/4.3/Availability/" xmlns:hc="http://webservices.test.com/og/4.3/HotelCommon/" xmlns="http://webservices.test.com/ows/5.1/Availability.wsdl"> 
     <HotelReference chainCode="AXA" hotelCode="AXAMUM" /> 
     <StayDateRange> 
     <hc:StartDate>2013-10-01</hc:StartDate> 
     <hc:EndDate>2013-10-10</hc:EndDate> 
     </StayDateRange> 
     <GuestCount> 
     <hc:GuestCount ageQualifyingCode="ADULT" count="1" /> 
     <hc:GuestCount ageQualifyingCode="CHILD" count="0" /> 
     </GuestCount> 
    </FetchCalendarRequest> 
    </soap:Body> 
</soap:Envelope> 


    Post Url :http://000.000.000.00:8080/ows_ws_51/Availability.asmx 
Soap Action : http://webservices.test.com/ows/5.1/Availability.wsdl#FetchCalendar 

Edit:Рабочий раствор 16 сентябрю 2013

Это решение с мылом PHP класса только я хочу это для работы с луком Nusoap.

<?php 

$wsdl = "http://###.###.###.##:8080/ows_ws_51/Availability.asmx?wsdl"; 
$client = new SoapClient($wsdl, array( 'soap_version' => SOAP_1_1,'trace' => true,)); 

//=========== Header Setting ============ 

$ns       = 'http://webservices.micros.com/og/4.3/Availability/'; //Namespace of the WS.//Body of the Soap Header. 
$strHeaderComponent_Session = <<<XML 
<OGHeader transactionID="005435" timeStamp="2008-12-09T13:26:56.4056250-05:00" xmlns="http://webservices.micros.com/og/4.3/Core/"> 
    <Origin entityID="OWS" systemType="WEB" /> 
    <Destination entityID="WEST" systemType="ORS" /> 
</OGHeader> 
XML; 
$objVar_Session_Inside  = new SoapVar($strHeaderComponent_Session, XSD_ANYXML, null, null, null); 
$objHeader_Session_Outside = new SoapHeader($ns , 'SessionHeader', $objVar_Session_Inside); 

// More than one header can be provided in this array. 
$client->__setSoapHeaders(array($objHeader_Session_Outside)); 

//============== Request ================ 

$xml = <<<XML 
<FetchCalendarRequest xmlns:a="http://webservices.micros.com/og/4.3/Availability/" xmlns:hc="http://webservices.micros.com/og/4.3/HotelCommon/" xmlns="http://webservices.micros.com/ows/5.1/Availability.wsdl"> 
    <HotelReference chainCode="AXA" hotelCode="{$DdlHotels}" /> 
    <StayDateRange> 
    <hc:StartDate>{$Arrive}</hc:StartDate> 
    <hc:EndDate>{$Depart}</hc:EndDate> 
    </StayDateRange> 
    <GuestCount> 
    <hc:GuestCount ageQualifyingCode="ADULT" count="1" /> 
    <hc:GuestCount ageQualifyingCode="CHILD" count="0" /> 
    </GuestCount> 
</FetchCalendarRequest> 
XML; 

$args = array(new SoapVar($xml, XSD_ANYXML)); 

try 
{ 

    $response = $client->__soapCall('FetchCalendar', $args); 
} 
catch (SoapFault $e) 
{ 
    echo "Error: {$e}"; exit; 
} 
+0

Если вы вставляете пример кода, позаботьтесь, чтобы он был правильно предназначен, читабельным и не содержал мертвого или ненужного кода отладки, но в идеале являлся полностью автономным рабочим примером. См. Мое редактирование. Кроме того, Stackoverflow работает лучше, если вы задаете один вопрос одновременно. – hakre

ответ

7

Вы можете использовать PHP встроенный в библиотеку SOAP для создания клиента SOAP и вызова метода из WSDL, попробовать что-то вроде этого:

$client = new SoapClient($wsdl, array( 'soap_version' => SOAP_1_1, 
             'trace' => true, 
             )); 
try { 
$params = array(
     //Your parameters here 
     );  
$res = $client->__soapCall('SoapMethod', $params); 
return $res; 
} catch (SoapFault $e) { 
echo "Error: {$e}"; 
} 

//for debugging what the outgoing xml looks like 
$client->__getLastRequest(); 

WSDL, должно помочь структурировать XML для Params ,Если вы не можете получить, чтобы работать так, как вы хотите, вы можете попробовать прохождение XML-самостоятельно, используя SoapVar() and setting the encode to XSD_ANYXML.

If you also need to add additional header information take a look at this example from the PHP docs.

+0

с вашими ссылками я получил решение для Soap PHP Class (''check ans edit''), я хочу решение с Nusoap. для которой граница. –

+0

@BhavinRana: Ну, ваш вопрос говорит разные: * «Я использовал nusoap здесь, но если у вас есть решение soap php class, также предлагается». * И это было дано здесь, вы говорите, что вы его работаете из-за предоставленных ресурсов, так что вы, возможно, должны подумать о своем * следующем вопросе о том, что * точно * вы хотите задать о * программировании мудрых *. – hakre

1
$params = array(//your params as specified by documentation); 
$result = $client->call(array("Availability"=>$params)); 
+0

спасибо за ан. можете ли вы сказать мне, какие параметры в этом XML-файле? i can not iden.how я могу передать его с hira. массив? –

+0

, пожалуйста, проверьте это http://webservices.micros.com/og/4.3/Availability.xsd – Lab

+0

Это ваши парметы, которые вам нужно пройти. – Lab

1

Может я предлагаю попробовать выучить SOAP с другим примером веб-сервиса. Документ wsdl, опубликованный для этой службы, представляется неполным, так как они ввели неправильный адрес SOAP для службы доступности. С неправильным или неполным документом WSDL используемая вами библиотека SOAP не сможет сформировать действительный запрос SOAP и отправить его в правильную конечную точку.

<wsdl:service name="AvailabilityService"> 
    <wsdl:port name="AvailabilityPort" binding="tns:AvailabilityBinding"> 
     <soap:address location="http://tempuri.org"/> 
    </wsdl:port> 
</wsdl:service> 

Как вы можете видеть, AvailabilityService конечная точка описывается как http://tempuri.org, что объясняется, как тест имен here по умолчанию.

В исходном посте у вас есть URL-адрес POST, описанный как http://000.000.000.00:8080/ows_ws_51/Availability.asmx. Как кто-то должен попробовать пример, если вы укажете «URL-адрес POST» как явно недопустимый URL-адрес.

Вы также указали документ WSDL как http://webservices.test.com/ows/5.1/Availability.wsdl, что также является недопустимым URL.

Вот пример PHP, доступ к допустимому документу WSDL, используя встроенную в PHP библиотеку SOAP, которую можно включить, включив расширение php_soap.dll в файле php.ini.

<?php 

    $wsdl = "http://www.restfulwebservices.net/wcf/StockQuoteService.svc?wsdl"; 

    $client = new SoapClient($wsdl, array(
     "trace"  => 1, 
     "exceptions" => 0)); 

    $parameters = array("request" => "IBM"); 

    $value = $client->GetStockQuote($parameters); 

    $json = json_encode($value); 

    echo $json; 
+0

Я не указал фактические URL-адреса по соображениям безопасности. но может сказать, что 000 - это IP, а test.com - это какой-то домен. –

0

Note: The following is more of a comment than an answer. I leave it here for further reference as it would not fit into a comment box and it references existing Q&A possible worth for future visitors

Вы задаете два вопроса относительно NuSOAP здесь:

  1. How to pass headers?
  2. How to pass FetchCalendarRequest with request like in XML?

Первый один Как передать заголовки? было указано уже в этом Q & A:

Как вы не написали конкретно в вашем вопросе, что это (и, возможно, другой из существующих) Q & А, не сделал работа для вас, это может не соответствовать вашим потребностям, но вам нужно дать подробный отзыв, я бы сказал.

Второй вопрос Как передать FetchCalendarRequest с запросом, как в XML?, вы, вероятно, имеете в виду, как вызвать действие или метод SOAP («Запрос»), который был назван в WSDL. Это уже пройдена, а также для NuSOAP на сайте StackOverflow:

Как вы не написали конкретно в вашем вопросе, что это (и, возможно, другой из) существующей Q & A для вас это не сработало, это может не соответствовать вашим потребностям, но вам нужно дать подробную обратную связь, я бы сказал, чтобы превратить это в конкретный вопрос программирования.

BTW Stackoverflow работает лучше всего, задавая один вопрос одновременно.

Смежные вопросы