Intereting Posts
Выполнение всех выходных файлов PHP проходит через «файл фильтра» перед отображением Как удалить ключ и его значение из ассоциативного массива? Есть ли преимущество для этого хэша для обеспечения безопасности? Кнопка возврата кодовой строки после выхода из системы Получение имен всех файлов в каталоге с PHP Единственный результат из базы данных с помощью mySQLi PHP: проверьте, существует ли узел XML с атрибутом браузер загружает php-файл с веб-сервера apache Объекты, переданные в поле выбора, должны управляться Установка Yosemite / El Capitan php-gd + mcrypt openssl_pkey_new () throwing errors – Правильная настройка openssl.cnf для php MySQL Query не вставлен, когда переменная PHP содержит одинарные кавычки Как я могу проверить покупку Google в приложении в php? Как сначала сделать первую часть сайта? (Как в Google PageSpeed) codeigniter – класс электронной почты – регистрация после отправки

Как я могу отправить XML SOAP через 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>') 

Solutions Collecting From Web of "Как я могу отправить XML SOAP через Curl и PHP?"

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.