【问题标题】:How to invoke a C# web service through PHP?如何通过 PHP 调用 C# Web 服务?
【发布时间】:2008-11-10 21:19:13
【问题描述】:

我已经使用 ASP.NET(在 C# 中)编写了一个 Web 服务,并且我正在尝试使用 NuSOAP 编写一个示例 PHP 客户端。我被绊倒的地方是如何做到这一点的例子;有些显示正在使用soapval(我不太了解参数 - 例如将false 传递为string 类型等),而另一些则直接使用arrays。假设http://localhost:3333/Service.asmx?wsdl 报告的我的 Web 服务的 WSDL 类似于:

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 类型是一种复杂类型,我很确定我的简单 $array 尝试不会自动使用,我正在我的 Web 服务中设置断点并看到我标记为 @987654329 的方法@(不重命名,字面意思是DoSomething)并且看到参数都是默认值(int0stringnull,等等)。

我的 PHP 语法应该是什么样的,我必须做什么才能正确传递 Param 类型?

【问题讨论】:

    标签: c# php web-services nusoap


    【解决方案1】:

    您必须将事物包装在大量嵌套数组中。

    <?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);
    ?>
    

    【讨论】:

    • 谢谢,经过这次经历,我对 PHP 产生了反感。
    • 真的吗?你责怪 PHP 开发了一个 3rd-party 库?这就像吃了劣质奶油糖果后不喜欢冰淇淋一样。
    【解决方案2】:

    有点不相关,但从 PHP5 开始,您对 SOAP 有本机支持。

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

    这样会方便一点。

    http://se.php.net/soap

    【讨论】:

      【解决方案3】:

      这里是支持原生 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);
      

      SoapClient 描述中的“.../IntegrationService/php”是 WCF 中的端点:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-04
        • 2012-05-26
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多