2010-06-09 121 views
33

這一直在困擾着我好幾天;我試圖通過Curl發送一個SOAP帖子,但我一直在收到「無法連接到主機」的錯誤,但是,我真的看不到如何。如何通過Curl和PHP發送SOAP XML?

我有一個ASP版本可以在相同的URL和數據下正常工作。我認爲這只是一個PHP /捲曲的東西。

目前,我有以下代碼(CURLOPT_POSTFIELDS數據是有效的SOAP信封字符串):

$soap_do = curl_init(); 
curl_setopt($soap_do, CURLOPT_URL,   "https://xxx.yyy.com:517/zzz.asmx"); 
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($soap_do, CURLOPT_TIMEOUT,  10); 
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($soap_do, CURLOPT_POST,   true);    
curl_setopt($soap_do, CURLOPT_POSTFIELDS,  '<soap:Envelope>...</soap:Envelope>'); 
curl_setopt($soap_do, CURLOPT_HTTPHEADER,  array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen('<soap:Envelope>...</soap:Envelope>'))); 

if(curl_exec($soap_do) === false) 
{     
    $err = 'Curl error: ' . curl_error($soap_do); 
    curl_close($soap_do); 
    return $err; 
} 
else 
{ 
    curl_close($soap_do); 
    return 'Operation completed without any errors'; 
} 

因此,任何想法,爲什麼它只是錯誤所有的時間?

ASP版本正常工作!代碼是:

Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP") 
xmlhttp.Open "POST","https://xxx.yyy.com:517/zzz.asmx" 
xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
xmlhttp.Send('<soap:Envelope>...</soap:Envelope>') 

回答

35

感謝很多好友,你的代碼已經爲我工作。

下面是代碼:

$soap_do = curl_init(); 
curl_setopt($soap_do, CURLOPT_URL,   $url); 
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($soap_do, CURLOPT_TIMEOUT,  10); 
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($soap_do, CURLOPT_POST,   true); 
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $post_string); 
curl_setopt($soap_do, CURLOPT_HTTPHEADER,  array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($post_string))); 
curl_setopt($soap_do, CURLOPT_USERPWD, $user . ":" . $password); 

$result = curl_exec($soap_do); 
$err = curl_error($soap_do); 
+2

我從來沒有得到一個適合我的答案,而且這個答案已經在2年前了,人們似乎覺得這個答案很有用,所以我會將其標記爲答案,謝謝。 – 2013-12-11 10:29:10

+0

有人可以幫我解決問題嗎?相反,這即是把上面的curl請求轉到soapclient請求? – mahen3d 2016-09-28 11:46:08

2

嘗試並使用CURLOPT_PORT設置端口號,因爲它可能不喜歡它作爲URL的一部分?

+0

已經嘗試過,一個和它不工作:/謝謝您的好意的想法 – 2010-06-09 15:34:35

11

我不得不使用

$headers = array(    
    "Content-type: text/xml;charset=\"utf-8\"", 
    "Accept: text/xml", 
    "Cache-Control: no-cache", 
    "Pragma: no-cache", 
    "SOAPAction: \"run\"", 
    "Content-length: ".strlen($xml), 
); 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
+0

謝謝大教堂,我會稍後再給你一個鏡頭,讓你知道它是否適用於我:) – 2010-06-14 12:15:04

+0

可悲的是,這對我來說並不起作用:( – 2010-06-18 08:46:07

+1

對於SOAPAction來說是「運行」。這是我所需的缺失部分肥皂服務器 – JasonWoof 2014-01-23 23:25:11

1

你也使用了錯誤的內容類型,應用/ XML是正確的類型。但是這不應該對cURL請求產生任何影響。

4

對於那些來自谷歌發現這一點,我遇到了類似的問題,試圖從一個PHP .NET SOAP服務器,當ASP方法工作正常互動。

我使用了數據包嗅探器來查看ASP客戶端正在發送什麼,並且注意到它在初始身份驗證請求後包含了cookie。所以我在我的cURL中啓用了cookie,並且它工作正常。

$cookiePath = tempnam('/tmp', 'cookie'); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath); 
+1

經過2天的工作,爲什麼它不工作,這固定它! – Josh 2013-11-26 20:43:23

3

這可能是舊的,但這個工作對我來說。我原本就有此功能的XML職位和肥皂就不會工作,直到我改變HTTPHEADERtext/xml而不是application/xml

function doXMLCurl($url,$postXML){ 
    $CURL = curl_init(); 

    curl_setopt($CURL, CURLOPT_URL, $url); 
    curl_setopt($CURL, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($CURL, CURLOPT_POST, 1); 
    curl_setopt($CURL, CURLOPT_POSTFIELDS, $postXML); 
    curl_setopt($CURL, CURLOPT_HEADER, false); 
    curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($CURL, CURLOPT_HTTPHEADER, array('Accept: text/xml','Content-Type: text/xml')); 
    curl_setopt($CURL, CURLOPT_RETURNTRANSFER, true); 
    $xmlResponse = curl_exec($CURL); 

    return $xmlResponse; 
}