PHP Nusoap - SOAP请求不起作用

时间:2013-08-08 12:13:55

标签: php web-services nusoap

您好我是非常新的webservice,在php中使用以下代码我正在尝试制作SOAP请求,如下面的XML所示,但它说错误

  

HTTP错误:不支持的HTTP响应状态405方法不允许(soapclient->响应包含响应内容)

问题:

  1. 如何传递标题?
  2. 如何使用XML格式的请求传递FetchCalendarRequest?
  3. 我在这里使用过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
    

    编辑: 工作解决方案2013年9月16日

    这个解决方案仅适用于Soap PHP Class,我希望它能与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;
    }
    

4 个答案:

答案 0 :(得分: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应该帮助构建params的xml。如果你不能按照你想要的方式工作,你可以尝试使用SoapVar() and setting the encode to XSD_ANYXML.自己传递xml

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我建议尝试使用不同的示例Web服务来学习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

在原始帖子中,您将“POST网址”描述为http://000.000.000.00:8080/ows_ws_51/Availability.asmx。如果您将“POST URL”列为显然无效的URL,那么任何人都应该尝试该示例。

您还将WSDL文档列为http://webservices.test.com/ows/5.1/Availability.wsdl,这也是一个无效的网址。

这是一个PHP示例,使用PHP的内置SOAP库访问有效的WSDL文档,可以通过在php.ini文件中启用php_soap.dll扩展来启用它。

<?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;

答案 3 :(得分:0)

  

注意: 以下是评论而不是答案。我将它留在这里以供进一步参考,因为它不适合评论框,它引用现有的Q&amp; A未来访客可能的价值

你在这里问两个关于Nusoap的问题:

  
      
  1. 如何传递标题?
  2.   
  3. 如何使用XML格式的请求传递FetchCalendarRequest?
  4.   

第一个如何传递标题?已在本Q&amp; A中概述:

由于你没有在你的问题中特别写下这个(以及可能的其他)现有问答的哪些不适合你,这可能不适合你的需要,但你需要先提供详细的反馈我说。

第二个问题如何使用XML中的请求传递FetchCalendarRequest?您可能意味着如何调用已在WSDL中命名的SOAP操作或方法(“请求”)。这已经在Stackoverflow网站上的Nusoap上进行了介绍:

由于你没有在你的问题中特别写下这个(以及可能的其他)现有问答的哪些不适合你,这可能不适合你的需要,但你需要先提供详细的反馈我说把它变成一个具体的编程问题。

BTW Stackoverflow最适合一次询问一个问题。