PHP Nusoap-SOAP请求不工作
您好,我是webservice的新手,在php和下面的代码中,我试图发出soap请求,如下面的XML所示,但它显示错误 HTTP错误:不支持的HTTP响应状态405方法不允许soapclient->response包含响应的内容 问题: 如何传递标题? 如何使用XML中的请求传递FetchCalendarRequest? 我在这里使用过Nusoap,但如果您有SOAP PHP类解决方案,也会邀请您使用 我的代码:PHP Nusoap-SOAP请求不工作,php,web-services,nusoap,Php,Web Services,Nusoap,您好,我是webservice的新手,在php和下面的代码中,我试图发出soap请求,如下面的XML所示,但它显示错误 HTTP错误:不支持的HTTP响应状态405方法不允许soapclient->response包含响应的内容 问题: 如何传递标题? 如何使用XML中的请求传递FetchCalendarRequest? 我在这里使用过Nusoap,但如果您有SOAP PHP类解决方案,也会邀请您使用 我的代码: <?php require_once('../lib/nusoap.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:
编辑:工作方案2013年9月16日
这个解决方案是使用Soap PHP类的,只是我想让它与Nusoap bow一起工作
<?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;
}
我建议尝试使用不同的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>
我建议尝试使用不同的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>
您可以使用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。如果您不能按您希望的方式使用它,您可以尝试使用
您可以使用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。如果您不能按您希望的方式使用它,您可以尝试使用
注意:以下是一个评论而不是一个答案。我把它放在这里作为进一步的参考,因为它不适合放在评论框中,并且它引用了现有的Q&a,可能对未来的访问者有价值
你在这里问了两个关于Nusoap的问题:
如何传递标题?
如何使用XML中的请求传递FetchCalendarRequest?
第一个问题是如何传递标题?已在本问答中概述:
由于你没有在你的问题中明确写下这一点和可能的其他现有问答不适合你,这可能不适合你的需要,但我想说的是,你需要首先给出详细的反馈
第二个问题是如何用XML中的请求传递FetchCalendarRequest?您可能指的是如何调用已在WSDL中命名的SOAP操作或方法请求。在Stackoverflow网站上,Nusoap也已经介绍了这一点:
由于您没有在问题中明确说明这一点和其他可能的现有问答对您不起作用,这可能不适合您的需要,但您需要首先给出详细的反馈,我想说的是,将其转化为一个具体的编程问题
顺便说一句,Stackoverflow每次问一个问题效果最好
注意:以下是一个评论而不是一个答案。我把它放在这里作为进一步的参考,因为它不适合放在评论框中,并且它引用了现有的Q&a,可能对未来的访问者有价值
你在这里问了两个关于Nusoap的问题:
如何传递标题?
如何使用XML中的请求传递FetchCalendarRequest?
第一个问题是如何传递标题?已在本问答中概述:
由于你没有在你的问题中明确写下这一点和可能的其他现有问答不适合你,这可能不适合你的需要,但我想说的是,你需要首先给出详细的反馈
第二个问题是如何用XML中的请求传递FetchCalendarRequest?您可能指的是如何调用已在WSDL中命名的SOAP操作或方法请求。在Stackoverflow网站上,Nusoap也已经介绍了这一点:
由于您没有在问题中明确说明这一点和其他可能的现有问答对您不起作用,这可能不适合您的需要,但您需要首先给出详细的反馈,我想说的是,将其转化为一个具体的编程问题
顺便说一句,Stackoverflow最好一次只问一个问题。谢谢你的回答。你能告诉我这个XML文件中的参数是什么吗?我想不起来。我怎么能和希拉一起通过呢。数组?这些是您需要传递的参数。我尝试了$result=$client->callAvailability,arrayStartDate=>2012-04-11T11:00:00.000Z,EndDate=>2012-04-12T11:00:00.000Z;但它表示HTTP错误:不支持的HTTP响应状态405方法不允许soapclient->response包含响应的内容请尝试$result=$client->callarrayAvailability=>arrayStartDate=>20
12-04-11T11:00:00.000Z,EndDate=>2012-04-12T11:00:00.000Z;现在它在7325行的C:\xampp\htdocs\nusoap-0.9.5\lib\nusoap.php中表示注意:数组到字符串的转换感谢ans。您能告诉我这个XML文件中的参数是什么吗?我想不起来。我怎么能和希拉一起通过呢。数组?这些是您需要传递的参数。我尝试了$result=$client->callAvailability,arrayStartDate=>2012-04-11T11:00:00.000Z,EndDate=>2012-04-12T11:00:00.000Z;但它表示HTTP错误:不支持的HTTP响应状态405方法不允许soapclient->response包含响应的内容请尝试$result=$client->callarrayAvailability=>arrayStartDate=>2012-04-11T11:00:00.000Z,EndDate=>2012-04-12T11:00:00.000Z;现在它说注意:出于安全原因,第7325i行C:\xampp\htdocs\nusoap-0.9.5\lib\nusoap.php中的数组到字符串转换没有给出实际的URL。但是可以说000是IP,test.com是某个域。出于安全原因,我没有给出实际的URL。但是可以说000是IP,test.com是某个域。通过您的链接,我得到了Soap PHP类“check ans edited”的解决方案,我想要使用Nusoap的解决方案。对于这个边界,@BhavinRana:你的问题是不同的:我在这里使用了nusoap,但是如果你有soap,也会邀请php类解决方案。这是在这里给出的,你说你得到它的资源,所以你也许应该考虑下一个问题,你到底想问关于编程的智慧。用你的链接,我得到了解决方案的SOAP PHP类“检查编辑”,我想用Nusoap解决方案。对于这个边界,@BhavinRana:你的问题是不同的:我在这里使用了nusoap,但是如果你有soap,也会邀请php类解决方案。这是在这里给出的,你说它是由于所提供的资源而工作的,所以你也许应该考虑下一个问题,你到底想问什么关于程序设计的智慧。如果你粘贴示例代码,请注意它是正确的,可读,并且不包含死的或不必要的调试代码,但更理想的是,它是一个完全自包含的工作示例。请参阅我的编辑。此外,如果您一次只问一个问题,Stackoverflow的效果会更好。如果您粘贴示例代码,请注意它是正确的、可读的,并且不包含死掉的或不必要的调试代码,但更理想的是,它是一个完全自包含的工作示例。请参阅我的编辑。此外,如果您一次只问一个问题,Stackoverflow的效果会更好。
$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();