2013-06-21 604 views
0

我正在使用基於SOAP的API將現有軟件包與第三方軟件包集成。但是,我無法從最後一次請求中生成XML以幫助排除故障,因爲我不相信實際發生的呼叫。我能想出的唯一合乎邏輯的解釋是,在實際發送請求之前,PHP正在驗證對WSDL的請求。該代碼對於這個問題不是必需的,並且我嘗試了太多的變體來挑選一個或兩個樣本進行分享。我用有效的SOAP調用替換了錯誤的SOAP調用,並且按預期成功生成並返回了XML。PHP在發送請求之前是否驗證WSDL請求?

有誰知道如何確定PHP是否發出請求並且請求失敗,或者是否有可能使PHP對WSDL無效並且根本無法進行調用?

如果您有任何問題,請隨時詢問。我感謝幫助!

回答

0

嘗試調試腳本以查看它是否實際發出請求,PHP的SoapClient對象使其非常容易。看看SoapClient::_getLastRequestSoapClient::_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>[email protected]</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] 
    [email protected]</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>                                 
#[email protected]:~# ## 
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調用?還有很多其他方法可以做到這一點,但調試應該是您的第一個停靠點。 :)

祝你好運,

安東尼。

0

它看起來像你的問題是:你試圖通過PHP在服務器端進行SOAP調用,你不知道是否調用。


如果您想檢查是否進行了調用,您可以用您的模擬對象替換SOAP對象,並在模擬對象中嘗試查看調用是否發生。