За последние 24 часа нас посетили 11612 программистов и 1179 роботов. Сейчас ищут 242 программиста …
-
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
Добрый день, уважаемые форумчане!
Уже третий день бьюсь над SOAP, весь нет перелопатила, не могу заставить его работать.
Давайте начну с описания системы: Windows XP, PHP 5.1.1 работает под IIS.
Стоит задача «дернуть» веб-сервис.
Код следующий и примитивен до безобразия:Данный код генерирует ошибку: На php.net нашла следующее:Вроде как симптомы мои
Что я сделала для подключения SOAP:
1. В php.ini подключила расширение:
extension=php_soap.dll
В папке с расширениями лежит соответствующая длл c:phpextensions php_soap.dll
2. Подключила php_curl.dll (в php.ini + файлы libeay32.dll и ssleay32.dll скопировала в системную папку c:WINDOWSsystem32 )
3. Подключила php_openssl.dll
4. Вроде как подключила libxml2.dll. Говорю «вроде» потому как там куча длл, и вменяемой инсрукции по установке под windows не нашла, только вот это, выполнила все шаги по инструкции:Кто-нибудь может подсказать, как проверить работоспособность libxml? Я до сих пор точно не уверена, нормально ли подключена библиотека.
Господа, буду всем благодарна за хоть какую-то помощь, потому как уже не знаю, что ещё попробовать и как заставить работать soap. -
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
Привет, девушка! =)
а первую строчку ты разумно проигнорировала? искать проще там где светлее, а не там, где потеряла?
там тебе был дан ответ сервером: 401.
ошибки потом просто от того, что не удалось подключиться. -
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
Ну не то, чтобы игнорировала…
Скорее не всё рассказала в своём письме.
Сперва я пыталась копать именно в сторону аутентификации.
Использовала для этого CURL:-
ini_set(«soap.wsdl_cache_enabled», «0»);
-
$wsdl_url=»http://dir/DataService.asmx?wsdl»;
-
$wsdl=file_get_contents_curl($wsdl_url);
-
$client = new SoapClient($wsdl);
-
function file_get_contents_curl($url) {
-
curl_setopt($ch, CURLOPT_HEADER, 0);
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set curl to return the data instead of printing it to the browser.
-
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
-
curl_setopt($ch, CURLOPT_USERPWD, ‘Login:Password’);
-
curl_setopt($ch, CURLOPT_URL, $url);
в итоге код даёт ошибку:
Причём переменная $wsdl содержит нужный мне wsdl-контент. Но soap его не съедает.
С этой ошибкой тоже не удалось сразиться. У меня лично вызывает сомнение, можно ли конструктору soap подсунуть контент wsdl, в то время как по мануалу нужен URI файла wsdl.
По-другому (кроме как с использованием curl) осуществить авторизованный вход не знаю как.
Может, кто-нибудь ещё что-то подскажет?Внимательнее прочитала мануал к SOAP и нашла способ использовать авторизацию без переподвыподвертов с curl:
-
$client = new SoapClient($wsdl_url, array(‘login’=>’Login’, ‘password’=>’Pass’));
в итоге имеем ошибку:
-
- С нами с:
- 2 июл 2011
- Сообщения:
- 4.074
- Симпатии:
- 7
Было тут у же про соап, не раз…
-
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
курл тут при чем? тоже светлее было? (о_О)
курл при чем тут? =) по соапу подключаешься! -
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
igordata, я ж объяснила, что курл использовала для авторизованного чтения контента по заданному урл, следом объяснила, что ошибалась и использовала тот же соап но с авторизацией.
К чему тут ваши издевательства? Если есть что сказать — то говорите прямо и без издевёк, а если нечего, то не тролльте и не тратьте ни своё ни моё время. -
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
так у вас оно работает или не работает? вы можете привести корректный код и нормальные, вызванные не черезжопным программированием, ошибки?
-
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
-
$wsdl_url=»http://dir/DataService.asmx?wsdl»;
-
ini_set(«soap.wsdl_cache_enabled», «0»);
-
$client = new SoapClient($wsdl_url, array(‘login’=>’Login’, ‘password’=>’Pass’));
Ошибка:
Код, по-моему, предельно нечерезжопный. Попытка элементарно создать объект soap вызывает ошибку. Я пытаюсь понять, что конкретно не нравится интерпретатору. Что такое «string(3316)» в тексте ошибки?
-
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
этот — да. А ошибки приводились к тому, что был выше.
соап вроде как умеет кидать эксепшны. Можно посмотреть, выкинет ли.
попробуй:
-
$client = new SoapClient($wsdl_url, array(‘login’=>‘Login’, ‘password’=>‘Pass’));
-
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
igordata, спасибо, в понедельник на работе попробую. Может, что и прояснится.
-
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
Продолжаю мучиться с soap. В понедельник пришла на работу запустила код:
-
$client = new SoapClient($wsdl_url, array(‘login’=>’Login’, ‘password’=>’Pass’));
Он продолажет выдавать ошибку:
Поговорила с людьми, которые писали сервис, они сказали, что используется не базовый тип аутентификации, а с шифрованием.
В итоге пробовала добавлять в параметры ‘authentication’=>’SOAP_AUTHENTICATION_DIGEST’, всё равно та же ошибка лезет.
Нашла в нете, как у человека не удавалось авторизоваться из-за того, что летела кодировка логина и пароля. В результате попробовала добавить в параметры ‘encoding’=>’UTF-8’ (на сервере используется кодировка utf-8).
По-прежнему лезет ошибка 401 Unauthorized.
Долго я пробовала всякие комбинации с параметрами, да всё равно ничего не получалось.В итоге решила попробовать режим не-WSDL:
-
ini_set(«soap.wsdl_cache_enabled», «0»);
-
$wsdl_url=«http://dir/DataService.asmx?wsdl»;
-
$service_location=‘http://dir/DataService.asmx’;
-
$service_uri=‘http://uri.org/’;
-
$options = array(‘login’=>$login,
-
‘location’=>$service_location,
-
‘authentication’=>‘SOAP_AUTHENTICATION_DIGEST’,
-
‘cache_wsdl’ => ‘WSDL_CACHE_NONE’,
-
‘soap_version’ => ‘SOAP_1_1’);
-
try { $client = new SoapClient(null, $options); }
-
catch (Exception $e) { print«Ошибка создания объекта SOAP:<br>».$e->getMessage().«<br>».$e->getTraceAsString(); }
-
$params = array(‘orderId’=>52, ‘statusId’=>3);
-
try { $response = $client->UpdateOrderStatus($params); }
-
catch (Exception $e) { print«Ошибка вызова функции UpdateOrderStatus:<br>».$e->getMessage().«<br>».$e->getTraceAsString(); }
-
print «Ошибка работы с SOAP:<br>».$e->getMessage().«<br>».$e->getTraceAsString();
В итоге (о УРА!) объект soap создаётся без проблем. Даже не знаю, радоваться или ещё рано.
Но не работает вызов метода веб-сервиса: -
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
А эксепшены, я смотрю, тебе понравились. Правильное дело! =)
Странно это всё. Это какой-то ваш внутренний корпоративный сайт? http://dir/
-
Sogno
Активный пользователь- С нами с:
- 20 июл 2012
- Сообщения:
- 7
- Симпатии:
- 0
Да, сервис писался нашими программистами и лежит на нашем сервере. Я просто заменила реальную директорию на dir. У нас такие политики безопасности, ууууу. И никак их не сломишь, этих защитников Родины.
-
Команда форума
Модератор- С нами с:
- 18 мар 2010
- Сообщения:
- 32.415
- Симпатии:
- 1.768
у вас нет доступа к тому проекту? к программистам? к документации? Есть у кого спросить, как надо логиниться-то?
22.08.13 — 10:36
Из платформы 8.3.2.163 опубликовал веб-сервис на IIS 5.1.
Установил PHP 5.3.271
Сделал файл index.php:
ini_set(«soap.wsdl_cache_enabled», «0»);
$client = new SoapClient(«http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl»;);
При открытии http://localhost/index.php получаю ошибку:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl’ : failed to load external entity «http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl»; in C:Inetpubwwwrootindex.php:5 Stack trace: #0 C:Inetpubwwwrootindex.php(5): SoapClient->SoapClient(‘http://localhos…’) #1 {main} thrown in C:Inetpubwwwrootindex.php on line 5
При этом если открыть http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl то нормально открывается описание веб сервиса:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<definitions xmlns=»http://schemas.xmlsoap.org/wsdl/»; xmlns:soap12bind=»http://schemas.xmlsoap.org/wsdl/soap12/»; xmlns:soapbind=»http://sch
… и т.д.
В чем может быть ошибка ?
1 — 22.08.13 — 10:38
Пардон, код PHP Таков:
ini_set(«soap.wsdl_cache_enabled», «0»);
$client = new SoapClient(«http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl»;);
2 — 22.08.13 — 10:39
т.е. там нет точки-запятой перед скобкой, подставляется почему то автоматически при публикации в форуме
3 — 22.08.13 — 10:47
Раздел [soap] из php.ini дай
4 — 22.08.13 — 10:51
И попробуй туда же раскомментировать
extension=php_openssl.dll
там где экстеншены
5 — 22.08.13 — 10:58
в разделе пхп все норм
[PHP_OPENSSL]
extension=php_openssl.dll
6 — 22.08.13 — 10:59
сори опять тороплюсь вот:
[PHP_SOAP]
extension=php_soap.dll
7 — 22.08.13 — 11:26
Обнаружил, что если в пхп написать
$client = new SoapClient(«bugaga»);
то ошибку выдает точно такую же.
А если например:
$client = new SoapClient_(«bugaga»);
то ошибка меняется
Fatal error: Class ‘SoapClient_’ not found in C:Inetpubwwwrootindex.php on line 5
8 — 22.08.13 — 11:40
9 — 22.08.13 — 15:39
(8) интересно. Установил, запустил ПХП. Просит пароль. Переустановил IIS, настроил у него ПХП, раздал права на папки. Пароль требовать перестал, но и ссылку
http://127.0.0.1/otladka/ws/lyay.1cws?wsdl
теперь не видит. Разбираюсь.
10 — 22.08.13 — 15:59
Заработало.
Подставил прилагаемый к примеру default.vrd и возможно (точно не помню)затронул настройки безопасности IIS/Свойства: otladka/Безопасность каталога/Анонимный доступ и проверка подл./Изменить. Установлены флаги:
Анонимный доступ
Разрешить управление паролем из ИИС
+Указано имя пользователя
На вкладке «Виртуальный каталог» кроме прочих доступны поля:
Локальный путь
Имя приложения
+кнопка Настройка
Еще вероятнее всего повлияло:
В конфигураторе при публикации Имя: otladka
где то на мисте читал что оно должно соответствовать названию своего каталога (C:Inetpubwwwroototladka)
11 — 22.08.13 — 16:01
а у меня по-умолчанию имя стояло: db
(8) хороший пример, спасибо !
12 — 23.08.13 — 10:15
И еще одна любопытная деталь:
Если сейчас обращусь по адресу http://127.0.0.1/index.php
без вопросов откроется пример
А если ввести адрес
http://127.0.0.1/otladka/ws/lyay.1cws?wsdl
То спросит логин и пароль. В этом примере, в PHP файле указаны логин и пароль: ‘site’
Так вот они подходят, что странно, учитывая что я их нигде не вводил ранее.
13 — 23.08.13 — 10:21
(0) кстати объявление «new SoapClient» , в соответствии с примером у меня теперь выглядит немного сложнее:
function ПодключитьсяК1С(){
if (!function_exists(‘is_soap_fault’)){
print ‘Не настроен web сервер. Не найден модуль php-soap.’;
return false;
}
try {
$Клиент1С = new SoapClient(‘http://127.0.0.1/otladka/ws/lyay.1cws?wsdl’,
array(‘login’ => ‘site’,
‘password’ => ‘site’,
‘soap_version’ => SOAP_1_2,
‘cache_wsdl’ => WSDL_CACHE_NONE, //WSDL_CACHE_MEMORY, //, WSDL_CACHE_NONE, WSDL_CACHE_DISK or WSDL_CACHE_BOTH
‘exceptions’ => true,
‘trace’ => 1));
}catch(SoapFault $e) {
trigger_error(‘Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.’, E_ERROR);
var_dump($e);
}
//echo ‘Раз<br>’;
if (is_soap_fault(Клиент1С)){
trigger_error(‘Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.’, E_ERROR);
return false;
}
return $Клиент1С;
}
790th
14 — 23.08.13 — 10:48
(12) это всего лишь пользователь бд
I am using the BingAds library for PHP.
I often get long periods of time where the API eventually fails.
The error messages I get are usually:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://api.bingads.microsoft.com/Api/Advertiser/CampaignManagement/V9/CampaignManagementService.svc?singleWsdl' : failed to load external entity "https://api.bingads.microsoft.com/Api/Advertiser/CampaignManagement/V9/CampaignManagementService.svc?singleWsdl" in [...] bingads/ClientProxy.php:183 Stack trace: #0 [...] bingads/ClientProxy.php(183): SoapClient->SoapClient('https://api.bin...', Array) #1 [...] bingads/ClientProxy.php(66): BingAdsProxyClientProxy->GetProxy('https://api.bin...') #2 [...] BingAdsProxyClientProxy::ConstructWithAccountId('https://api.bin...', '[...]', '[...]', '[...]', '[...]', NULL) [...]
Warning: DOMDocument::load(https://api.bingads.microsoft.com/Api/Advertiser/CampaignManagement/V9/CampaignManagementService.svc?singleWsdl) [domdocument.load]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in [...]/bingads/ClientProxy.php on line 98
Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]/bingads/ClientProxy.php on line 128Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]/bingads/ClientProxy.php on line 134
Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]bingads/ClientProxy.php on line 140
Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]/bingads/ClientProxy.php on line 146
Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]bingads/ClientProxy.php on line 152
Warning: SoapHeader::SoapHeader() [soapheader.soapheader]: Invalid namespace in [...]/bingads/ClientProxy.php on line 158
Fatal error: Uncaught SoapFault exception: [s:Server] Invalid client data. Check the SOAP fault details for more information
The second series of warnings and fatal error comes after 6 or 7 successful API calls to retrieve AdGroup and Ad data for a series of AdGroups. Eventually it fails.
Then it will work for several days, then have several days of getting errors again.
Any ideas?
Issue summary:
with the same Drupal 622 configuration I have three different behaviours, please help me on finding the right settings.
In all cases I enable only drupal minimum modules (ctools, services, server_soap current dev versions) and set only one endpoint enabling system and user defaults resources
the same test script is run against all urls.
the test script connects and login to the service. very basic.
Issue details:
Installation 1: localhost, soap services: wsdl is properly downloaded and the test script works fine
Installation 2: bitnami drupal virtual appliance on a LAN physical server. Everything works fine as locally.
Installation 3: bitnami drupal virtual appliance hosted by Amazon: firewall rules enable tcp port 80 from everywhere.
I CAN download the wsdl file, but any further request gets this error:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://46.137.153.108/drupal/?q=ws?wsdl’ : failed to load external entity «http://46.137.153.108/drupal/?q=ws?wsdl» in Z:xampphtdocswssitesallDrupal-Services-And-SOAP-testsoap_server_test2.php:26 Stack trace: #0 Z:xampphtdocswssitesallDrupal-Services-And-SOAP-testsoap_server_test2.php(26): SoapClient->__soapCall(‘system_soap_con…’, Array) #1 {main} thrown in Z:xampphtdocswssitesallDrupal-Services-And-SOAP-testsoap_server_test2.php on line 26
Installation 4: hosted service at Aruba.it. any access to the endpoint gives me error 404 page not found.
Conclusions: I am spending a lot of time to develop my application, but I am stalled at this problem. I am also contacting service providers support to get help, in this case it is not clear WHAT I shall ask as according to my knowledge SOAP requests are passed over a standard http protocol.
I may also have introduced some errors in the configuration as I started with services 1.x, 2.x and then 3.x, so I am really confused. This is why I am testing a very basic configuration.
here below the testing script:
$wsdl = "http://46.137.153.108/drupal/ws?wsdl";
$options = array(
'cache_wsdl' => 0,
);
$client = new SoapClient($wsdl, $options);
echo '<pre>'.print_r($client,true).'</pre>';
$response = $client->__soapCall('system_soap_connect', array());
echo '<pre>'.print_r($response,true).'</pre>';
$session_id = $response->sessid;
$response = $client->__soapCall('user_soap_login', array('administrator', 'xxxxxx'));
echo '<pre>'.print_r($response,true).'</pre>';
$session_id = $response->sessid;
if ($session_id) {
$response = $client->__soapCall('system_soap_get_variable', array('site_info','x'));
echo '<pre>'.print_r($response,true).'</pre>';
}
else {
print 'Could not authenticate user';
}
print "n";