您好我是非常新的webservice,在php中使用以下代码我正在尝试制作SOAP请求,如下面的XML所示,但它说错误
HTTP错误:不支持的HTTP响应状态405方法不允许(soapclient->响应包含响应内容)
问题:
我在这里使用过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;
}
答案 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的问题:
- 如何传递标题?
- 如何使用XML格式的请求传递FetchCalendarRequest?
醇>
第一个如何传递标题?已在本Q&amp; A中概述:
由于你没有在你的问题中特别写下这个(以及可能的其他)现有问答的哪些不适合你,这可能不适合你的需要,但你需要先提供详细的反馈我说。
第二个问题如何使用XML中的请求传递FetchCalendarRequest?您可能意味着如何调用已在WSDL中命名的SOAP操作或方法(“请求”)。这已经在Stackoverflow网站上的Nusoap上进行了介绍:
由于你没有在你的问题中特别写下这个(以及可能的其他)现有问答的哪些不适合你,这可能不适合你的需要,但你需要先提供详细的反馈我说把它变成一个具体的编程问题。
BTW Stackoverflow最适合一次询问一个问题。