Это раздражало меня в течение нескольких дней; Я пытаюсь отправить сообщение 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>')
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);
Мне пришлось использовать
$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 в моем cURL, и он отлично работал.
$cookiePath = tempnam('/tmp', 'cookie'); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
Это может быть старым, но эта работа для меня. Первоначально у меня была эта функция для сообщения XML, и мыло не работало, пока я не изменил 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-адреса?
Вы также используете неправильный Content-type, application / xml – правильный тип. Но это не должно иметь никакого значения для запроса cURL.