2010-06-09 118 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; 
}