这几天困扰着我;我正在尝试通过Curl发送SOAP帖子,但我只是不断收到“无法连接到主机”错误,但是,我真的看不出怎么回事。
我有一个ASP版本,可以使用相同的URL和数据。我认为这只是一个PHP / Curl的事情。
我目前有以下代码(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>')
答案 0 :(得分:36)
Thanx很多伙伴,你的代码对我有用。
以下是代码:
$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);
答案 1 :(得分: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);
答案 2 :(得分:4)
对于那些从Google发现这个问题的人来说,当ASP方法工作正常时,我遇到了类似的问题,尝试与PHP的.NET SOAP服务器进行交互。
我使用数据包嗅探器来查看ASP客户端发送的内容,确切地说,并注意到在初始身份验证请求之后它包含了cookie。所以我在我的cURL中启用了cookie,它工作正常。
$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
答案 3 :(得分:3)
这可能很旧,但这对我有用。我最初有这个功能用于XML帖子,在我将HTTPHEADER
更改为text/xml
而不是application/xml
之前,soap不起作用:
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;
}
答案 4 :(得分:2)
尝试使用CURLOPT_PORT设置端口号,因为它可能不喜欢它作为URL的一部分?
答案 5 :(得分:1)
您还使用了错误的Content-type,application / xml是正确的类型。但这不应该对cURL请求产生任何影响。