如何在 SOAP 用戶端中提供 SOAP API 策略/擴充要求
P粉511896716
2023-08-29 20:09:01
<p>我需要連接到一個soap api ...現在我已經使用過soap api幾次了,但是由於99%的api現在都處於休息狀態,我已經有好幾年沒有使用它們了</p> ;
<p>當我使用soap客戶端呼叫api時,我得到</p>
<pre class="brush:php;toolbar:false;">SOAP-ERROR: Parsing WSDL: Unknown required WSDL extension 'http://schemas.xmlsoap.org/ws/2004/09/policy'</ pre>
<p>因此,當我在瀏覽器中開啟 wsdl 位址(登入/密碼保護)時,我可以在 xml 輸出中看到這些行</p>
<pre class="brush:php;toolbar:false;"><wsdl:definitions xmlns:p1="urn:haixin:all2crm"xmlns:wsp="http://schemas.xmlsoap.org/ ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsdl= "http://schemas.xmlsoap.org/wsdl/" name="SI_USBPC_REQUEST" targetNamespace="urn:haixin:all2crm">
<wsdl:documentation/>
<wsp:UsingPolicy wsdl:required="true"/>
<wsp:Policy wsu:Id="OP_SI_USBPC_REQUEST"/></pre>
<p>在我有的地方</p>
<pre class="brush:php;toolbar:false;"><wsp:Policy>
<wsp:PolicyReference URI="#OP_SI_USBPC_REQUEST"/>
</wsp:Policy></pre>
<p>當我搜尋此錯誤時,我只能在整個互聯網中找到1 個資源,答案是關閉策略要求,即: <code><wsp:UsingPolicy wsdl:required="false"/> </code> 但我不擁有api,所以當我搜尋策略名稱<code>OP_SI_USBPC_REQUEST</code> 時,這也是沒有問題的,我沒有得到任何結果,所以我猜測這是api 所有者設定的一些自訂名稱</p>
<p>所以我的問題是我應該制定政策並將其附加到肥皂客戶端請求中嗎?
政策和擴展之間的聯繫是什麼,因為我收到擴展丟失錯誤,但如果我關閉政策要求,它就會消失</p>
<p>可以從某處下載擴充嗎?格式是什麼...我應該將它們附加到肥皂客戶端請求中嗎? </p>
<p>或者它是應該安裝在伺服器上的東西?如果我以某種方式添加擴展程序,錯誤就會消失,因為我已經將用戶名/密碼附加到 api 調用,或者這只是第一步,之後我應該處理策略要求嗎?</p>
<p>順便說一句,我使用 php 呼叫 api,這是我的程式碼</p>
<pre class="brush:php;toolbar:false;">$options = [
'login' => 'mlogin',
'password' => 'mypassword',
];
$client = new \SoapClient("http://domain:port/dir/wsdl/?p=sa/92130e1ffa97338ba2d1fc026567031d" , $options );</pre>
<p>如果我下載 xml 並關閉對本地文件的要求並在肥皂客戶端中使用該文件地址,我可以使用該文件與 api 對話嗎? (我的理解是xml不包含任何實際數據,它只是soap客戶端的接口/定義,我無法使用本地文件與在線api對話,或者也許我錯了?)</p>
訊息「未知所需的 WSDL 擴充」表示 SoapClient 在外部發現了一個元素 WSDL 命名空間的
wsdl:required
屬性設定為true
(正如您在此處看到的)。因此,為了避免該錯誤,一種方法是將
wsdl:required
屬性設為false
。完全可以下載 WSDL 檔案、修改它並使用本機副本。只需確保使用 絕對路徑,如此處所示。
順便說一下,此上下文中的「策略」指的是 WS-Policy 規格。