2008-11-10 2 views
3

Я написал веб-службу с использованием ASP.NET (в C#), и я пытаюсь написать пример PHP-клиента с помощью NuSOAP. Где я споткнулся - примеры того, как это сделать; некоторые показывают soapval (и я не совсем понимаю параметры - например, передаю false как string типов и т. д.), в то время как другие просто используют прямой array s. Давайте скажем WSDL для моего веб-сервиса как сообщает http://localhost:3333/Service.asmx?wsdl выглядит примерно так:Как вызвать веб-сервис C# через PHP?

POST /Service.asmx HTTP/1.1 
Host: localhost 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/webservices/DoSomething" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <DoSomething xmlns="http://tempuri.org/webservices"> 
     <anId>int</anId> 
     <action>string</action> 
     <parameters> 
     <Param> 
      <Value>string</Value> 
      <Name>string</Name> 
     </Param> 
     <Param> 
      <Value>string</Value> 
      <Name>string</Name> 
     </Param> 
     </parameters> 
    </DoSomething> 
    </soap:Body> 
</soap:Envelope> 

Моя первая попытка PHP выглядит так:

<?php 
require_once('lib/nusoap.php'); 
$client = new nusoap_client('http://localhost:3333/Service.asmx?wsdl'); 

$params = array(
    'anId' => 3, //new soapval('anId', 'int', 3), 
    'action' => 'OMNOMNOMNOM', 
    'parameters' => array(
     'firstName' => 'Scott', 
     'lastName' => 'Smith' 
    ) 
); 
$result = $client->call('DoSomething', $params, 'http://tempuri.org/webservices/DoSomething', 'http://tempuri.org/webservices/DoSomething'); 
print_r($result); 
?> 

Теперь в стороне от типа Param будучи сложным типом, который я» m довольно уверен, что моя простая попытка $array не будет работать автоматически, я остановлюсь в своем веб-сервисе и вижу метод, который я обозначил как WebMethod (без его переименования, его буквально DoSomething), и видя, что аргументы являются значениями по умолчанию (int - 0, string - null и т. Д.).

Каким должен быть мой синтаксис PHP, и что мне нужно сделать, чтобы правильно передать тип Param?

ответ

6

Вы должны обернуть вещи в тоннах вложенных массивов.

<?php 
require_once('lib/nusoap.php'); 
$client = new nusoap_client('http://localhost:3333/Service.asmx?wsdl'); 

$params = array(
     'anId' => 3, 
     'action' => 'OMNOMNOMNOM', 
     'parameters' => array(
       'Param' => array(
        array('Name' => 'firstName', 'Value' => 'Scott'), 
        array('Name' => 'lastName', 'Value' => 'Smith') 
         ) 
    ) 
); 
$result = $client->call('DoSomething', array($params), 
       'http://tempuri.org/webservices/DoSomething', 
       'http://tempuri.org/webservices/DoSomething'); 
print_r($result); 
?> 
+0

Спасибо, После этого опыта я не любил PHP. – cfeduke 2008-11-10 22:32:15

3

Сортировка несвязанных, но с PHP5 у вас есть встроенная поддержка SOAP.

 
$client = new SoapClient("some.wsdl"); 
$client->DoSomething($params); 

Это может быть немного более удобным.

http://se.php.net/soap

1

Здесь образец с нативной поддержкой SOAP:

// Create a new soap client based on the service's metadata (WSDL) 
    $client = new SoapClient("http://some.wsdl", 
     array('location' => 'http://127.0.0.100:80/IntegrationService/php')); 

    $params = array(); 
    $params['lead']['Firstname'] = $user->firstname; 
    $params['lead']['Lastname']  = $user->lastname; 
    $params['lead']['Product']  = $product; 
    $params['lead']['JobTitle']  = $user->job_title; 
    $params['lead']['Email']  = $user->mail; 
    $params['lead']['Phone']  = $user->phone; 
    $params['lead']['CompanyName'] = $user->company_name; 
    $params['lead']['City']   = $user->city; 
    $params['lead']['Industry']  = $user->industry; 

    $client->SubmitLead($params); 

Где .../IntegrationService/PHP 'в описании SoapClient является конечной точкой в ​​WCF:

<endpoint 
      address="php" 
      binding="basicHttpBinding" 
      contract="Integration.Service.IDrupalIntegrationService" />