Как я могу отправить SOAP XML через Curl и PHP? - PullRequest
33 голосов
/ 09 июня 2010

Это беспокоило меня уже несколько дней;Я пытаюсь отправить сообщение 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 ]

36 голосов
/ 07 мая 2011

Спасибо, приятель, твой код сработал для меня.

Вот код:

$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);  
11 голосов
/ 10 июня 2010

Я должен был использовать

$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); 
4 голосов
/ 16 февраля 2012

Для тех, кто нашел это от Google, я столкнулся с подобной проблемой, пытаясь взаимодействовать с сервером .NET SOAP из PHP, когда метод ASP работал нормально.

Я использовал анализатор пакетов, чтобы точно узнать, что отправляет клиент ASP, и заметил, что он включает файлы cookie после первоначального запроса аутентификации. Так что я включил куки в моем cURL, и он работал нормально.

$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
3 голосов
/ 14 июня 2013

Это может быть старым, но эта работа для меня. У меня изначально была эта функция для сообщения 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;
}
2 голосов
/ 09 июня 2010

Попробуйте установить номер порта с помощью CURLOPT_PORT, поскольку, возможно, он не является частью URL-адреса?

1 голос
/ 17 сентября 2010

Вы также используете неправильный тип контента, application / xml - правильный тип.Но это не должно иметь никакого значения для запроса cURL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...