在发送请求之前,PHP是否根据WSDL验证请求


Does PHP Validate Requests Against a WSDL Prior to Sending the Request?

我正在利用基于SOAP-的API将现有软件包与第三方软件包集成。但是,我无法从上次请求中生成XML来帮助进行故障排除,因为我不相信实际会进行调用。我能想到的唯一合乎逻辑的解释是,PHP在实际发送请求之前根据WSDL验证请求。这个问题不需要代码,我已经尝试了太多的变体,无法选择一两个样本进行共享。我已经用一个有效的SOAP调用替换了有故障的SOAP调用,XML生成并按预期成功返回。

是否有人知道如何确定PHP是否正在发出请求而请求失败,或者是否有可能让PHP根据WSDL使请求无效而根本无法发出调用?

如果您有问题,请随时提问。我很感激你的帮助!

试着调试你的脚本,看看它是否真的在发出请求,PHP的SoapClient对象让它变得很容易。看看SoapClient::_getLastRequest和SoapClient::_getLastResponse。

如果你想要更低一点的东西,ngrep是一个很好的简单工具,可以监视电线上发生的事情。

以这个简单的PHP脚本为例。。。

<?php
$client = new SoapClient('http://www.27seconds.com/kb/ws/Articles.asmx?WSDL');
$article = $client->GetArticle(array('articleId' => 7));

执行ngrep port 80 &,然后执行上面的脚本会转储流量,看起来应该类似于。。。

##
T 208.106.153.223:80 -> 10.0.2.15:40760 [AS]
  ..                                                                                                                                                                  
##
T 10.0.2.15:40760 -> 208.106.153.223:80 [AP]
  POST /kb/ws/Articles.asmx HTTP/1.1..Host: www.27seconds.com..Connection: Keep-Alive..User-Agent: PHP-SOAP/5.3.10-1ubuntu3.6..Content-Type: text/xml; charset=utf-8..
  SOAPAction: "http://dsetzer.27seconds.com/ws/GetArticle"..Content-Length: 279....<?xml version="1.0" encoding="UTF-8"?>.<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://sc
  hemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://dsetzer.27seconds.com/ws/"><SOAP-ENV:Body><ns1:GetArticle><ns1:articleId>7</ns1:articleId></ns1:GetArticle></SOA
  P-ENV:Body></SOAP-ENV:Envelope>.                                                                                                                                    
#
T 208.106.153.223:80 -> 10.0.2.15:40760 [A]
  ......                                                                                                                                                              
#
T 208.106.153.223:80 -> 10.0.2.15:40760 [A]
  HTTP/1.1 200 OK..Date: Fri, 21 Jun 2013 21:11:21 GMT..Server: Microsoft-IIS/6.0..X-Powered-By: ASP.NET..X-AspNet-Version: 2.0.50727..Cache-Control: private, max-age
  =0..Content-Type: text/xml; charset=utf-8..Content-Length: 4804....<?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:Body><GetArticleResponse xmlns="http://dsetzer.2
  7seconds.com/ws/"><GetArticleResult><xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msda
  ta"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element 
  name="Articles"><xs:complexType><xs:sequence><xs:element name="ArticleID" type="xs:int" minOccurs="0" /><xs:element name="ArticleTitle" type="xs:string" minOccurs="
  0" /><xs:element name="ArticleSummary" type="xs:string" minOccurs="0" /><xs:element name="ArticleAuthorID" type="xs:int" minOccurs="0" /><xs:element name="ArticlePu
  blishDate" type="xs:dateTime" minOccurs="0" /><xs:element name="AuthorName" type="xs:string" minOccurs="0" /><xs:element name="AuthorEmail" type="xs:string" minOccu
  rs="0" /><xs:element name="AuthorHomepage" type="xs:string" minOccurs="0" /><xs:element name="ArticleBody" t                                                        
##
T 208.106.153.223:80 -> 10.0.2.15:40760 [AP]
  ype="xs:string" minOccurs="0                                                                                                                                        
##
T 208.106.153.223:80 -> 10.0.2.15:40760 [A]
  " /><xs:element name="ArticleRating" type="xs:double" minOccurs="0" /></xs:sequence></xs:complexType></xs:element><xs:element name="Authors"><xs:complexType><xs:seq
  uence><xs:element name="AuthorID" type="xs:int" minOccurs="0" /><xs:element name="AuthorName" type="xs:string" minOccurs="0" /><xs:element name="AuthorEmail" type="
  xs:string" minOccurs="0" /></xs:sequence></xs:complexType></xs:element><xs:element name="Applicables"><xs:complexType><xs:sequence><xs:element name="appID" type="xs
  :int" minOccurs="0" /><xs:element name="appDescr" type="xs:string" minOccurs="0" /></xs:sequence></xs:complexType></xs:element><xs:element name="Keywords"><xs:compl
  exType><xs:sequence><xs:element name="KeyID" type="xs:int" minOccurs="0" /><xs:element name="KeyArticleId" type="xs:int" minOccurs="0" /><xs:element name="Keyword" 
  type="xs:string" minOccurs="0" /></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="ur
  n:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><Articles diffgr:id="Articles1" msdata:rowOrder="0
  "><ArticleID>7</ArticleID><ArticleTitle>Handle double quotes in a form.</ArticleTitle><ArticleSummary>When pulling data from a form or database you can into trouble
   if the data contains a double quote (&amp;quot;).</ArticleSummary><ArticleAuthorID>1</ArticleAuthorID><Arti                                                        
##
T 208.106.153.223:80 -> 10.0.2.15:40760 [AP]
  clePublishDate>2002-03-05T11                                                                                                                                        
##
T 208.106.153.223:80 -> 10.0.2.15:40760 [A]
  :40:54-05:00</ArticlePublishDate><AuthorName>Douglas L. Setzer, II</AuthorName><AuthorEmail>dsetzer@27seconds.com</AuthorEmail><AuthorHomepage>http://www.27seconds.
  com</AuthorHomepage><ArticleBody>&lt;p&gt;..When I was dynamically populating form values, I found that if the data has a double quote (&amp;qout;) in it, it would 
  cut off the data entered in the form...&lt;/p&gt;....&lt;p&gt;..To solve this, I found that I could simple Server.HtmlEncode the value and all was well.  Except whe
  n I was populating from a database and the data was NULL which caused an error for Server.HtmlEncode.  So, I whipped up this little function:..&lt;/p&gt;....&lt;p&g
  t;..&lt;div style="width=450;height=300;overflow=scroll;"&gt;..&lt;pre&gt;..Function formEncode(formValue)..Dim m_sOut..    m_sOut = formValue.....If IsNull(m_sOut)
   Then....m_sOut = ""...Else....m_sOut = Server.HTMLEncode(m_sOut)...End If.....formEncode = m_sOut....End Function..&lt;/pre&gt;..&lt;/div&gt;..&lt;/p&gt;....&lt;p&
  gt;This is used when you assign a value to the form field:&lt;/p&gt;....&lt;p&gt;..&lt;div style="width=450;height=300;overflow=scroll;"&gt;..&lt;pre&gt;..&amp;lt;i
  nput type="text" name="example" value="&amp;lt;%=formEncode("The ""test"" is good.") %&amp;gt;"&amp;gt;..&lt;/pre&gt;..&lt;/div&gt;..&lt;/p&gt;</ArticleBody></Artic
  les><Authors diffgr:id="Authors1" msdata:rowOrder="0"><AuthorID>1</AuthorID><AuthorName>Douglas L. Setzer, I                                                        
##
T 208.106.153.223:80 -> 10.0.2.15:40760 [AP]
  I</AuthorName><AuthorEmail>d                                                                                                                                        
#
T 208.106.153.223:80 -> 10.0.2.15:40760 [AP]
  setzer@27seconds.com</AuthorEmail></Authors><Applicables diffgr:id="Applicables1" msdata:rowOrder="0"><appID>1</appID><appDescr>Active Server Pages (ASP)</appDescr>
  </Applicables><Keywords diffgr:id="Keywords1" msdata:rowOrder="0"><KeyID>386</KeyID><KeyArticleId>7</KeyArticleId><Keyword>CHR(34)</Keyword></Keywords><Keywords dif
  fgr:id="Keywords2" msdata:rowOrder="1"><KeyID>388</KeyID><KeyArticleId>7</KeyArticleId><Keyword>DOUBLE QUOTE</Keyword></Keywords><Keywords diffgr:id="Keywords3" msd
  ata:rowOrder="2"><KeyID>387</KeyID><KeyArticleId>7</KeyArticleId><Keyword>QUOTE</Keyword></Keywords></NewDataSet></diffgr:diffgram></GetArticleResult></GetArticleRe
  sponse></soap:Body></soap:Envelope>                                                                                                                                 
#root@precise64:~# ##
T 208.106.153.223:80 -> 10.0.2.15:40760 [A]
  ......                                                                                                                                                              
#
T 208.106.153.223:80 -> 10.0.2.15:40760 [AF]
  ......     

注意到SOAP调用了吗?有很多其他方法可以做到这一点,但调试应该是您的第一个调用端口。:)

祝你好运,

安东尼。

看起来您的问题是:您正试图通过服务器端的PHP进行SOAP调用,但您不知道是否进行了调用。


如果您想检查是否进行了调用,可以将SOAP对象替换为您的mock对象,并在mock对象中尝试查看是否进行了该调用。