1

您好,我对 web 服务非常陌生,在 php 中使用以下代码我正在尝试发出如下 XML 所示的肥皂请求,但它显示错误

HTTP 错误:不支持的 HTTP 响应状态 405 Method Not Allowed(soapclient->response 有响应的内容)

问题:

  1. 如何传递标头?
  2. 如何使用 XML 中的请求传递 FetchCalendarRequest?

我在这里使用过 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 类,我希望它与 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

4 回答 4

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。如果你不能让它以你想要的方式工作,你可以尝试使用SoapVar() 自己传递 xml 并将编码设置为 XSD_ANYXML。

如果您还需要添加额外的标头信息,请查看 PHP 文档中的这个示例。

于 2013-09-11T17:16:25.080 回答
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 ,在这里被解释为默认的测试命名空间。

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

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

这是一个 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;
于 2013-09-11T15:18:48.090 回答
1
$params = array(//your params as specified by documentation);
$result = $client->call(array("Availability"=>$params));
于 2013-08-08T12:37:30.950 回答
0

注意:以下是评论而不是答案。我将其留在这里以供进一步参考,因为它不适合评论框,并且它引用了现有的问答可能对未来的访问者有价值

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

  1. 如何传递标头?
  2. 如何使用 XML 中的请求传递 FetchCalendarRequest?

第一个如何传递标头?已在此问答中概述:

由于您没有在您的问题中具体写出哪些(以及可能的其他)现有问答对您不起作用,这可能不适合您的需求,但您需要先给出详细的反馈。

第二个问题如何像在 XML 中一样通过 FetchCalendarRequest 请求?您可能是指如何调用已在 WSDL 中命名的 SOAP 操作或方法(“请求”)。Stackoverflow 网站上的 Nusoap 也已对此进行了介绍:

由于您没有在您的问题中具体写出哪些(以及可能的其他)现有问答对您不起作用,这可能不适合您的需求,但您需要先给出详细的反馈,我想说把它变成一个具体的编程问题。

顺便说一句,Stackoverflow 一次问一个问题效果最好。

于 2013-09-17T07:35:29.510 回答