65.9K
CodeProject 正在变化。 阅读更多。
Home

PHP Web Service WSDL 生成器 / SOAP 服务器 (文档/字面量)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (10投票s)

2013 年 1 月 27 日

CPOL

6分钟阅读

viewsIcon

204901

downloadIcon

6271

生成所需的 WSDL 文件和 SOAP 服务器,用于接收来自 InfoPath 的数据 (文档/字面量格式)。

介绍 

这一切的起因是我开发了一个独立的 PHP/MySQL 应用程序。然后,出现了一个从 InfoPath 表单提交数据的需求。 

在我搜索互联网的过程中,我实在找不到任何人记录了如何用 PHP 开发一个可以与 InfoPath 通信的 Web 服务,每个人似乎都使用 ASP 或 C#。我尝试使用 NuSOAP,但文档有点少,我只能让它与 RPC 编码一起工作。问题是 InfoPath 需要文档/字面量的 WSDL XML……而我对命名空间和模式的理解非常糟糕!

于是,这个项目就诞生了…… 

背景

这非常基础,实际上只涵盖了 WSDL 的请求/响应方法。它假设您已经知道如何用 PHP 编码并在 InfoPath 中创建表单。

注意:请确保您的 PHP 安装中启用了 *PHP_SOAP* 扩展。 

使用代码

这个设计旨在非常容易实现,并且易于维护升级。有两个文件值得关注:

  • wsdl.php
  • soap-service.php

wsdl.php 是一个将为您生成 WSDL XML 的脚本。这是您的 SOAP 客户端 (在此示例中是 InfoPath) 指向的文件。soap-service.php 是 SOAP 服务器。您可以将其命名为您想要的任何名称,只要在 *wsdl.php* 的函数声明中正确链接即可。

步骤 1

编辑 *wsdl.php* 并替换注释下方的区域。在这里,我们为 Web 服务命名,并定义我们希望 Web 服务可用的函数。我们的函数是一个简单的调查,用于询问用户姓名、喜欢的颜色和喜欢的数字。SOAP 服务器会将这些结果保存到一个纯文本文件中。我们将此函数命名为 ChooseColour

$serviceName = "My Example Web Service Access Point";

$functions[] = array(
"funcName" => "ChooseColour",
    "doc" => "Send a favourite colour and number to a text file.",
    "inputParams" => array(array("name" => "Name", "type" => "string"),
		       array("name" => "FavColour", "type" => "string"),
                           array("name" => "FavNumber", "type" => "int")),
"outputParams" => array(array("name" => "Success", "type" => "boolean")),
"soapAddress" => "https:///soap-service.php"
    );

希望这很简单,但还是解释一下:

  • serviceName:Web 服务的名称 - 可以是任何由 A-Z、0-9 或空格组成的字符。
  • $functions 数组
    • funcName:SOAP 客户端看到的函数名,以及 PHP SOAP 服务器中要运行的函数。
    • doc:关于函数的文档,SOAP 客户端可见。
    • inputParams:函数每个输入参数的数组。每个参数都由一个带有 "name" 和 "type" 键的数组指定。Type 应该是 W3 XML 类型 之一。如果您不需要输入参数,则不要将此键添加到您的数组中。
    • outputParams:同上,只是处理返回结果参数。
    • soapAddress:这将是包含您的函数 PHP 代码的 SOAP 服务器。

此数组中可以根据需要声明任意数量的函数。所有函数都以相同的方式声明。

您只需要做这些。现在您拥有了一个功能性的 WSDL 生成器!

第二步

现在!让我们来测试一下,确保一切正常……将 *wsdl.php* 文件放在您的 Web 服务器上,然后用浏览器访问它。您应该会看到页面列出了您声明的 Web 服务名称,以及您声明的所有函数列表。底部灰色框中是 SOAP 客户端将看到的原始 XML WSDL 输出。本文顶部有一个此输出的示例。 

说到 SOAP 客户端:为了让它们获取 XML WSDL 输出,您需要在 URL 末尾添加 "?WSDL" (不带引号),否则它们将收到您刚才看到的页面。如果您添加 "?WSDL",下面是它们将收到的内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<wsdl:definitions 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:s="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.darkerwhite.com/" 
    xmlns:tns="http://www.darkerwhite.com/" 
    name="MyExampleWebServiceAccessPoint" 
>

<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://www.darkerwhite.com/">
        <s:element name="ChooseColourRequest">
            <s:complexType><s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="Name" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="FavColour" type="s:string" />
                <s:element minOccurs="1" maxOccurs="1" name="FavNumber" type="s:int" />
            </s:sequence></s:complexType>
        </s:element>
        <s:element name="ChooseColourResponse">
            <s:complexType><s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="Success" type="s:boolean" />
            </s:sequence></s:complexType>
        </s:element>
    </s:schema>
</wsdl:types>

<wsdl:message name="ChooseColourRequest">
    <wsdl:part name="parameters" element="tns:ChooseColourRequest" />
</wsdl:message>
<wsdl:message name="ChooseColourResponse">
    <wsdl:part name="parameters" element="tns:ChooseColourResponse" />
</wsdl:message>

<wsdl:portType name="ChooseColourPortType">
    <wsdl:operation name="ChooseColour">
        <wsdl:input message="tns:ChooseColourRequest" />
        <wsdl:output message="tns:ChooseColourResponse" />
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="ChooseColourBinding" type="tns:ChooseColourPortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="ChooseColour">
        <soap:operation soapAction="https:///dwss-service.php#ChooseColour" style="document" />
        <wsdl:input><soap:body use="literal" /></wsdl:input>
        <wsdl:output><soap:body use="literal" /></wsdl:output>
        <wsdl:documentation>Send a favourite colour and number to a text file.</wsdl:documentation>
    </wsdl:operation>
</wsdl:binding>

<wsdl:service name="MyExampleWebServiceAccessPoint">
    <wsdl:port name="ChooseColourPort" binding="tns:ChooseColourBinding">
        <soap:address location="https:///dwss-service.php" />
    </wsdl:port>
</wsdl:service>

</wsdl:definitions>

那么,让我们在 SOAP 客户端 (InfoPath Designer) 中进行测试。启动 InfoPath Designer 并创建一个数据连接。创建一个空白表单,然后点击功能区中的 *数据* 选项卡,然后点击 *数据连接*。然后点击 *添加*,然后点击 *创建到提交数据的新连接*,然后按下一步。然后选择 *到 Web 服务*,然后按下一步。现在输入您的 *wsdl.php* 文件的 URL……类似 https:///wsdl.php。在末尾添加 "?WSDL" 以获取原始 XML 输出 (https:///wsdl.php?WSDL)。如果您忘记了,InfoPath 会自动添加。按下一步以访问 Web 服务!

如果一切正常,您现在应该会看到您声明的函数列表。选择一个函数并按下一步将使您能够访问您所有输入参数及其数据类型的列表。您现在可以为这些参数选择,并选择与它们绑定的表单数据字段。

步骤 3

好的,我们知道连接可用了——让我们构建表单来测试它。

从 *主页* 功能区,将三个 *文本框* (从控件部分) 拖到空白表单上。然后,将一个 *按钮* 拖到表单上。右键单击第三个文本框,然后点击文本框属性。从数据类型框中选择 *整数 (Integer)*。选择数据连接,遵循步骤 2 中的步骤,但现在您可以将数据源字段分配给您刚刚创建的字段。选择 "tns:Name" 参数,然后选择 "字段或组" 单选按钮。然后按文本框右侧看起来像树节点序列的按钮。从 myFields 中选择 field1

现在选择 "tns:FavColour" 并选择 field2。

最后选择 "tns:FavNumber" 并选择 field3 - 这是我们指定为整数的字段。如果您在表单字段和数据连接字段之间存在数据类型不匹配,提交表单时将出现验证错误。

现在按下一步,并确保选中 "设为默认提交连接",然后按完成。右键单击按钮,然后点击按钮属性。点击操作框,选择提交,然后按确定。现在激活表单的完全信任,以允许它在本地计算机上运行:*文件 -> 表单选项 -> 安全性和信任 -> 完全信任*。

完成!如果您愿意,可以随意美化它。 

步骤 4

现在编辑我们的 *soap-service.php* 文件来实现我们想要调用以创建调查结果文件的 ChooseColour() 函数: 

<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$server = new SoapServer("https:///wsdl.php?WSDL"); // WSDL file for function definitions
$server->addFunction("ChooseColour");	// Same func name as in our WSDL XML, and below
$server->handle();  

function ChooseColour($formdata) {
    $attempt = false; // File writing attempt successful or not
    $formdata = get_object_vars($formdata); // Pull parameters from SOAP connection
    
    // Sort out the parameters and grab their data
    $myname = $formdata['Name']; 
    $mycolour = $formdata['FavColour'];
    $mynumber = $formdata['FavNumber'];
    
    $str =  "Name: " . $myname . ", ";
    $str .= "Colour: " . $mycolour . ", ";
    $str .= "Number: " . $mynumber . "\r\n";
    
    $filename = "./formdata.txt";
    if (($fp = fopen($filename, "a")) == false) return array('Success' => false);
    if (fwrite($fp, $str)) {
    	$attempt = true;
    }
    fclose($fp);     

    return array('Success' => $attempt);
}
?>

参数由 SoapServer 类的 handle 函数自动排序!我们只需要记住参数的名称即可。很简单!

大功告成!您现在可以运行您的 InfoPath 表单并与您的 PHP 项目进行通信了!

步骤 5

回到 InfoPath Designer,在 *主页* 功能区,按 *预览*。这将启动表单。现在在第一个字段中输入您的姓名,在第二个字段中输入您喜欢的颜色,在最后一个字段中输入您喜欢的数字。最后按提交。表单将关闭。现在导航到您的 https:/// 文件夹,您应该会发现一个 formdata.txt 文件,其中包含您刚刚输入的信息!

希望我帮助了某些人,因为我在尝试让这个工作时几乎要疯了。我需要使用的特定技术组合在互联网上并未得到广泛使用/记录,所以这是我的贡献。感谢阅读,祝您好运!

历史 

  • 版本 1.0.1
  • 源文件已转换为 UTF-8 编码,并添加了 W. Kleinschmit 建议的以下行 (感谢!): 

    header("Content-Type: application/soap+xml; charset=utf-8"); 
  • 版本 1.0.0
  • 初稿。

© . All rights reserved.