Как я могу отправить SOAP XML через Curl и PHP?
Это не давало мне покоя в течение нескольких дней; Я пытаюсь отправить сообщение SOAP через Curl, но я просто продолжаю получать ошибку "не удалось подключиться к хосту", но я действительно не вижу, как это сделать.
У меня есть версия 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>')
6 answers
Спасибо большое, приятель, твой код сработал для меня.
Вот код:
$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);
Мне пришлось использовать
$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);
Для тех, кто нашел это в Google, я столкнулся с аналогичной проблемой, пытаясь взаимодействовать с сервером .NET SOAP с PHP, когда метод ASP работал нормально.
Я использовал анализатор пакетов, чтобы узнать, что именно отправлял клиент ASP, и заметил, что он включал файлы cookie после первоначального запроса на аутентификацию. Поэтому я включил файлы cookie в своем локоне, и это сработало нормально.
$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
Это может быть старым, но это работает для меня. Изначально у меня была эта функция для XML-сообщения, и soap не будет работать, пока я не изменю HTTPHEADER
на text/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;
}
Попробуйте установить номер порта с помощью CURLOPT_PORT, так как, возможно, ему не нравится это как часть URL-адреса?
Вы также используете неправильный тип контента, приложение/xml - правильный тип. Но это не должно иметь никакого значения для запроса cURL.