2013-05-24 3 views
1

Мне нужно подключиться к SOAP-серверу с php, я прочитал много документации, примеров и руководств, но я до сих пор не могу выполнить аутентификацию на своем сервере. Я сделал работу ниже:Соединение SoapClient с SoapServer

$agencyNumber = 7818619810; 
    $fullTransmission = false; 
    //$context = array('header' => 'Content-type: application/soap+xml; charset=utf-8'); 
    $params = array('agencyNumber'  => 7818619810, 'fullTransmission' => 0/*,$context*/); 

    $client = new SoapClient("http://link/to/server?wsdl"); 
    $test = $client->__getFunctions(); 
    var_dump($test);// returns the functions my supplier provides, as well __getTypes() gives a bunch of variable arrays ect.. 
    $response = $client->__soapCall('GetTransmissionTicket',array($params));//line 16 which is mentioned on error print 
    var_dump($response); 

Даже если я поставил $context, когда я пытаюсь запустить, я получаю ошибку ниже:

Fatal error: Uncaught SoapFault exception: [HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'. in C:\xampp\htdocs\xml\inc\connection_test.php:16 Stack trace: #0 [internal function]: SoapClient->__doRequest('http://interfac...', '..//my-provider...', 1, 0) #1 C:..path..test.php(16): SoapClient->__soapCall('GetTransmission...', Array) #2 {main} thrown in C:..path..test.php on line 16

Удаленный метод, который я пытаюсь позвонить называется GetTransmissionTicket, которая принимает два параметра, (int)agencyNumber и fullTransmission (BOOL) ..

Я хочу подчеркнуть, что есть много потоков на эту тему, некоторые из которых очень близко к моему вопросу (1, 2, 3 и т. Д.), Но я действительно не мог решить проблему. Пожалуйста, дайте руку. С уважением ..

ответ

2

Простой пример с мылом и PHP может быть

$url="your WSDL url"; 
$method = "Method you are calling"; 
$error=0; 
$client = new SoapClient($url); 

try 
    { 
    $info = $client->__call($method, array($param)); 
    } 
    catch (SoapFault $fault) 
{ 
    $error = 1; 
    errorReport($fault->faultcode,$fault->faultstring); 
    die; 
    /*echo '<script type="text/javascript">alert("Sorry,App Returne the following ERROR:'.$fault->faultcode."-".$fault->faultstring.' We will now take you back to our homepage."); window.location = "'.$_SERVER['PHP_SELF'].'";</script> '; */ 

     } 

    if($error==1) 
     { 
     $xml=$fault->faultstring; 
    }else{ 
     $xml = $info; 
    } 
    return $xml; 

Попробуйте его реализации и дайте мне знать. если это сработает для вас.

+1

спасибо за ваше внимание, но неопределенная функция errorReport. также я не мог понять, что вы пытались сделать. Является ли это функцией или, что вы «возвращаете»? – ilhnctn

+0

Actuly Это была функция, созданная в моем коде, я выбрал только важную часть. Здесь errorReport - метод SoapFault, который даст вам ошибку, если она возникла при вызове wsdl . Я возвращаю сообщение с мыльным конвертом iff $ error == 0, что означает, что я получил метод возвращаемых значений в $ xml; Пройдите код снова по линии, вы узнаете ... Если у вас все еще есть вопрос .PLease не стесняйтесь спрашивать. –

1

Не должна быть последней строки var_dump ($ response); вместо var_dump ($ client);

В любом случае, вы можете также попытаться использовать это, чтобы получить результат:

$response = $client->GetTransmissionTicket(array($params)); 
var_dump($response); 
+0

да это должно быть ответ, я Editted спасибо за предупреждение , Но опять-таки это дает ошибку: Исключить исключение SoapFault: [HTTP] Не удается обработать сообщение, потому что тип содержимого «text/xml; charset = utf-8 'не был ожидаемым типом' application/soap + xml; кодировка = UTF-8' . в ... – ilhnctn

+0

Я думаю, что проблема в точности такая же, как это - [link] (http://stackoverflow.com/q/5405874/1858648) Это ответ в соответствии с этим вопросом - ** SOAP-сервер вы используете, не претендует на стандарт 1.2. ** – abhi191

9

Попытка $params = array('agencyNumber' => 7818619810, 'fullTransmission' => false);

вместо $params = array('agencyNumber' => 7818619810, 'fullTransmission' => 0);

ИЛИ

Применение $client = new SoapClient("http://link/to/server?wsdl", array('soap_version' => SOAP_1_1));

, потому что application/soap+xml является тип содержимого передается при использовании SOAP 1.2, text/xml используется с SOAP 1.1 ,

Ссылка:how to change content-type of request?

0

может быть немного поздно, но может помочь другим. так вот он идет: $params уже массив, поэтому вам не придется использовать массив ($ Params) в

$response = $client->__soapCall('GetTransmissionTicket',array($params)); 

вместо использовать простой $ Params в то время как calling.check это так

$response = $client->GetTransmissionTicket($params); 

также использовать $client->__getTypes(); для проверки параметров, которые необходимо передать. использовать улов для хорошего эффекта для отслеживания ошибки и дефекта. в конце, если все еще не получить решение, проверьте его с помощью soapUI (программного обеспечения).

+0

Я решил проблему с помощью nuSoap, но поскольку на форумах сказано, что nuSoap не является предпочтительным решением, я не разделял свой ответ. Благодарю. – ilhnctn

+0

К сожалению, ваше решение ничего не сделало, я запустил свое собственное решение (nuSoap), пытаясь попробовать ваше. – ilhnctn

+0

@ İlhanÇetin Пожалуйста, можете ли вы разместить свое решение – Duli

0

Я отвечу на свой вопрос, чтобы однажды это помогло кому-то. Я использовал nusoap и изменил кодировку на utf-8.Фрагмент кода ниже:

require_once "nusoap.php"; 
$client = new nusoap_client("http://interface.--Serivce-Supplier-Link/Service.svc?wsdl", "wsdl"); 
$client->soap_defencoding = 'UTF-8'; 

$result = $client->call("GetTransmissionTicket", array('agencyNumber'  => 13155, 'fullTransmission' => false)); 
var_dump($result); 

С наилучшими пожеланиями

1

Я resloved эти проблемы за счет перехода от SOAP 1.2 к SOAP 1.1

$this->client = new SoapClient(
    $url, 
    array(
     "trace" => TRUE, 
     "exception" => 0, 
     "soap_version" => SOAP_1_1, 
     "cache_wsdl" => WSDL_CACHE_MEMORY, 
     "local_cert" => 'mycert.pem', 
    ) 
); 
Смежные вопросы