使用Web服务调用AEM Forms

本文档中的示例和示例仅适用于JEE环境中的AEM Forms。

服务容器中的大多数AEM Forms服务都配置为公开Web服务,完全支持Web服务定义语言(WSDL)生成。 也就是说,您可以创建使用AEM Forms服务的本机SOAP堆栈的代理对象。 因此,AEM Forms服务可以交换和处理以下SOAP消息:

  • SOAP请求:由请求操作的客户端应用程序发送到Forms服务。
  • SOAP响应:在处理SOAP请求后,由Forms服务发送到客户端应用程序。

使用Web服务,您可以执行与使用Java API相同的AEM Forms服务操作。 使用Web服务调用AEM Forms服务的一个好处是,您可以在支持SOAP的开发环境中创建客户端应用程序。 客户端应用程序不绑定到特定的开发环境或编程语言。 例如,您可以使用Microsoft Visual Studio .NET和C#作为编程语言创建客户端应用程序。

AEM Forms服务通过SOAP协议公开,并且符合WSI基本配置文件1.1。 Web服务互操作性(WSI)是一个开放标准组织,旨在促进跨平台的Web服务互操作性。 有关信息,请参阅https://www.ws-i.org/

AEM Forms支持以下web服务标准:

  • 编码:仅支持文档和文字编码(根据WSI基本配置文件,这是首选编码)。(请参阅使用Base64编码调用AEM Forms。)
  • MTOM:表示一种使用SOAP请求对附件进行编码的方法。(请参阅使用MTOM调用AEM Forms。)
  • SwaRef:表示使用SOAP请求对附件进行编码的另一种方法。(请参阅使用SwaRef调用AEM Forms。)
  • 带有附件的SOAP:支持MIME和DIME(直接Internet消息封装)。这些协议是通过SOAP发送附件的标准方式。 Microsoft Visual Studio .NET应用程序使用DIME。 (请参阅使用Base64编码调用AEM Forms。)
  • WS-Security:支持用户名密码令牌配置文件,这是作为WS Security SOAP标头的一部分发送用户名和密码的标准方式。AEM Forms还支持HTTP基本身份验证。 (请参阅使用WS-Security标头传递凭据。)

要使用Web服务调用AEM Forms服务,通常需要创建使用服务WSDL的代理库。 使用Web服务调用AEM Forms​部分使用JAX-WS创建Java代理类来调用服务。 (请参阅使用JAX-WS创建Java代理类。)

您可以通过指定以下URL定义来检索服务WDSL(方括号中的项是可选项):

 https://<your_serverhost>:<your_port>/soap/services/<service_name>?wsdl[&version=<version>][&async=true|false][lc_version=<lc_version>```

其中:

* *your_serverhost* 表示托管AEM Forms的J2EE应用程序服务器的IP地址。
* *your_* port表示J2EE应用程序服务器使用的HTTP端口。
* *service_* name表示服务名称。
* ** version表示服务的目标版本(默认使用最新的服务版本)。
* `async` 指定值以 `true` 为异步调用启用其他操 `false` 作(默认情况下)。
* *lc_* version表示要调用的AEM Forms版本。

下表列出了服务WSDL定义(假定AEM Forms已部署在本地主机上,而post为8080)。

<table>
 <thead>
  <tr>
   <th><p>服务</p></th>
   <th><p>WSDL定义</p></th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><p>汇编程序</p></td>
   <td><p><code>http://localhost:8080/soap/services/ AssemblerService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>返回和恢复</p></td>
   <td><p><code>http://localhost:8080/soap/services/BackupService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>条形码表单</p></td>
   <td><p><code>http://localhost:8080/soap/services/ BarcodedFormsService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>转换PDF</p></td>
   <td><p><code>http://localhost:8080/soap/services/ ConvertPDFService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>Distiller</p></td>
   <td><p><code>http://localhost:8080/soap/services/ DistillerService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>DocConverter </p></td>
   <td><p><code>http://localhost:8080/soap/services/DocConverterService?WSDL</code></p></td>
  </tr>
  <tr>
   <td><p>文档管理</p></td>
   <td><p><code>http://localhost:8080/soap/services/DocumentManagementService?WSDL</code></p></td>
  </tr>
  <tr>
   <td><p>加密 </p></td>
   <td><p><code>http://localhost:8080/soap/services/EncryptionService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>表单</p></td>
   <td><p><code>http://localhost:8080/soap/services/FormsService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>表单数据集成</p></td>
   <td><p><code>http://localhost:8080/soap/services/FormDataIntegration?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>生成PDF</p></td>
   <td><p><code>http://localhost:8080/soap/services/ GeneratePDFService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>生成3D PDF</p></td>
   <td><p><code>http://localhost:8080/soap/services/Generate3dPDFService?WSDL</code></p></td>
  </tr>
  <tr>
   <td><p>输出</p></td>
   <td><p><code>http://localhost:8080/soap/services/ OutputService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>PDF实用程序 </p></td>
   <td><p><code>http://localhost:8080/soap/services/ PDFUtilityService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>Acrobat Reader DC扩展</p></td>
   <td><p><code>http://localhost:8080/soap/services/ ReaderExtensionsService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>存储库</p></td>
   <td><p><code>http://localhost:8080/soap/services/ RepositoryService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>权限管理 </p></td>
   <td><p><code>http://localhost:8080/soap/services/ RightsManagementService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>签名 </p></td>
   <td><p><code>http://localhost:8080/soap/services/ SignatureService?wsdl</code></p></td>
  </tr>
  <tr>
   <td><p>XMP实用程序</p></td>
   <td><p><code>http://localhost:8080/soap/services/ XMPUtilityService?wsdl</code></p></td>
  </tr>
 </tbody>
</table>

**AEM Forms进程WSDL定义**

必须在WSDL定义中指定应用程序名称和进程名称,才能访问属于在Workbench中创建的进程的WSDL。 假定应用程序的名称为`MyApplication`,进程的名称为`EncryptDocument`。 在这种情况下,请指定以下WSDL定义:

```java
 http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl

[!NOTE]

有关示例MyApplication/EncryptDocument短生命周期进程的信息,请参阅短生命周期进程示例

[!NOTE]

应用程序可以包含文件夹。 在这种情况下,请在WSDL定义中指定文件夹名称:

 http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl

使用Web服务访问新功能

可以使用Web服务访问新的AEM Forms服务功能。 例如,在AEM Forms中,引入了使用MTOM对附件进行编码的功能。 (请参阅使用MTOM调用AEM Forms。)

要访问AEM Forms中引入的新功能,请在WSDL定义中指定lc_version属性。 例如,要访问新的服务功能(包括MTOM支持),请指定以下WSDL定义:

 http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl&lc_version=9.0.1

[!NOTE]

在设置lc_version属性时,请确保使用三位数。 例如,9.0.1等于版本9.0。

Web服务BLOB数据类型

AEM Forms服务WSDL定义了许多数据类型。 Web服务中公开的最重要的数据类型之一是BLOB类型。 使用AEM Forms Java API时,此数据类型映射到com.adobe.idp.Document类。 (请参阅使用Java API将数据传递到AEM Forms服务。)

BLOB对象向AEM Forms服务发送和检索二进制数据(例如,PDF文件、XML数据等)。 BLOB类型在服务WSDL中定义如下:

 <complexType name="BLOB">
     <sequence>
         <element maxOccurs="1" minOccurs="0" name="contentType"
             type="xsd:string"/>
         <element maxOccurs="1" minOccurs="0" name="binaryData"
             type="xsd:base64Binary"/>
         <element maxOccurs="1" minOccurs="0" name="attachmentID"
             type="xsd:string"/>
         <element maxOccurs="1" minOccurs="0" name="remoteURL"
             type="xsd:string"/>
         <element maxOccurs="1" minOccurs="0" name="MTOM"
             type="xsd:base64Binary"
             xmime:expectedContentTypes="*/*"
             xmlns:xmime="https://www.w3.org/2005/05/xmlmime"/>
         <element maxOccurs="1" minOccurs="0" name="swaRef"
             type="tns1:swaRef"/>
         <element maxOccurs="1" minOccurs="0" name="attributes"
             type="impl:MyMapOf_xsd_string_To_xsd_anyType"/>
     </sequence>
 </complexType>

MTOMswaRef字段仅在AEM Forms中受支持。 仅当您指定的URL包含lc_version属性时,才能使用这些新字段。

在服务请求中提供BLOB对象

如果AEM Forms服务操作需要BLOB类型作为输入值,请在应用程序逻辑中创建BLOB类型的实例。 (位于​使用AEM表单进行编程的许多Web服务快速入门都显示了如何使用BLOB数据类型。)

将值分配给属于BLOB实例的字段,如下所示:

  • Base64:要将数据作为以Base64格式编码的文本进行传递,请在字段中设 BLOB.binaryData 置数据,并在字段中以MIME格式(例如 application/pdf)设置数据 BLOB.contentType 类型。(请参阅使用Base64编码调用AEM Forms。)
  • MTOM:要在MTOM附件中传递二进制数据,请在字段中设置 BLOB.MTOM 数据。此设置会使用Java JAX-WS框架或SOAP框架的本机API将数据附加到SOAP请求中。 (请参阅使用MTOM调用AEM Forms。)
  • SwaRef:要在WS-I SwaRef附件中传递二进制数据,请在字段中设置 BLOB.swaRef 数据。此设置会使用Java JAX-WS框架将数据附加到SOAP请求。 (请参阅使用SwaRef调用AEM Forms。)
  • MIME或DIME附件:要在MIME或DIME附件中传递数据,请使用SOAP框架的本机API将数据附加到SOAP请求。在BLOB.attachmentID字段中设置附件标识符。 (请参阅使用Base64编码调用AEM Forms。)
  • 远程URL:如果数据托管在Web服务器上并且可通过HTTP URL访问,请在字段中设置 BLOB.remoteURL HTTP URL。(请参阅使用HTTP上的BLOB数据调用AEM Forms。)

访问从服务返回的BLOB对象中的数据

返回的BLOB对象的传输协议取决于多个因素,这些因素按以下顺序考虑,在满足主要条件时停止:

  1. 目标URL指定传输协议。如果在SOAP调用中指定的目标URL包含参数​blob="BLOB_TYPE",则​BLOB_TYPE​将确定传输协议。 BLOB_ TYPE是base64、dime、mime、http、mtom或swaref的占位符。

  2. 服务SOAP端点是智能。如果以下条件为真,则使用与输入文档相同的传输协议返回输出文档:

    • 输出Blob对象的服务的SOAP端点参数默认协议设置为Smart。

      对于具有SOAP端点的每项服务,管理控制台允许您为任何返回的Blob指定传输协议。 (请参阅管理帮助。)

    • AEM Forms服务将一个或多个文档作为输入。

  3. 服务SOAP端点不是智能。所配置的协议确定文档传输协议,并在相应的BLOB字段中返回数据。 例如,如果SOAP端点设置为DIME,则返回的blob将位于blob.attachmentID字段中,而不考虑任何输入文档的传输协议。

  4. 否则。如果服务不将文档类型作为输入,则在HTTP协议的BLOB.remoteURL字段中返回输出文档。

如第一个条件中所述,您可以通过扩展带有后缀的SOAP端点URL来确保任何返回文档的传输类型,如下所示:

     https://<your_serverhost>:<your_port>/soap/services/<service
     name>?blob=base64|dime|mime|http|mtom|swaref

以下是传输类型与从中获取数据的字段之间的关联:

  • Base64格式:将后 blob 缀设 base64 置为,以返回字段中的 BLOB.binaryData 数据。
  • MIME或DIME附件:将后缀 blob 设置为 DIMEMIME ,以将数据作为相应的附件类型返回,并在字段中返回附件 BLOB.attachmentID 标识符。使用SOAP框架的专有API从附件中读取数据。
  • 远程URL:将后 blob 缀设 http 置为保留应用程序服务器上的数据,并返回指向字段中数据的 BLOB.remoteURL URL。
  • MTOM或SwaRef:将后缀 blob 设置为 mtomswaref ,以将数据作为相应的附件类型返回,并在或字段中返回附 BLOB.MTOM 件标 BLOB.swaRef 识符。使用SOAP框架的本机API从附件中读取数据。

[!NOTE]

通过调用setBinaryData方法填充BLOB对象时,建议不要超过30 MB。 否则,可能会出现OutOfMemory异常。

[!NOTE]

使用MTOM传输协议的基于JAX WS的应用程序被限制为25 MB的发送和接收数据。 此限制是由于JAX-WS中存在错误所致。 如果已发送和已接收文件的合计大小超过25MB,请使用SwaRef传输协议,而不是MTOM传输协议。 否则,可能会出现OutOfMemory异常。

基64编码字节阵列的MTOM传输

除了BLOB对象外,MTOM协议还支持任何复杂类型的字节数组参数或字节数组字段。 这意味着支持MTOM的客户端SOAP框架可以将任何xsd:base64Binary元素作为MTOM附件(而不是base64编码的文本)发送。 AEM Forms SOAP端点可以读取此类字节数组编码。 但是,AEM Forms服务始终返回字节数组类型作为base64编码文本。 输出字节数组参数不支持MTOM。

返回大量二进制数据的AEM Forms服务使用文档/BLOB类型,而不是字节数组类型。 文档类型对于传输大量数据的效率更高。

Web服务数据类型

下表列出了Java数据类型,并显示了相应的Web服务数据类型。

Java数据类型

Web服务数据类型

java.lang.byte[]

xsd:base64Binary

java.lang.Boolean

xsd:boolean

java.util.Date

DATE类型,在服务WSDL中定义,如下所示:

<complexType name="DATE">

<sequence>

<element maxOccurs="1" minOccurs="0" name="date" type="xsd:dateTime" />

<element maxOccurs="1" minOccurs="0" name="calendar" type="xsd:dateTime" />

</sequence>

</complexType>

如果AEM Forms服务操作输入java.util.Date值,则SOAP客户端应用程序必须传递DATE.date字段中的日期。 在这种情况下,设置DATE.calendar字段会导致运行时异常。 如果服务返回java.util.Date,则在DATE.date字段中重新调整日期。

java.util.Calendar

DATE类型,在服务WSDL中定义,如下所示:

<complexType name="DATE">

<sequence>

<element maxOccurs="1" minOccurs="0" name="date" type="xsd:dateTime" />

<element maxOccurs="1" minOccurs="0" name="calendar" type="xsd:dateTime" />

</sequence>

</complexType>

如果AEM Forms服务操作输入java.util.Calendar值,则SOAP客户端应用程序必须传递DATE.caledendar字段中的日期。 在这种情况下,设置DATE.date字段会导致运行时异常。 如果服务返回java.util.Calendar,则在DATE.calendar字段中返回日期。

java.math.BigDecimal

xsd:decimal

com.adobe.idp.Document

BLOB

java.lang.Double

xsd:double

java.lang.Float

xsd:float

java.lang.Integer

xsd:int

java.util.List

MyArrayOf_xsd_anyType

java.lang.Long

xsd:long

java.util.Map

apachesoap:Map,在服务WSDL中定义,如下所示:

<schema elementFormDefault="qualified" targetNamespace="https://xml.apache.org/xml-soap" xmlns="https://www.w3.org/2001/XMLSchema">

<complexType name="mapItem">

<sequence>

<element name="key" nillable="true" type="xsd:anyType"/>

<element name="value" nillable="true" type="xsd:anyType"/>

</sequence>

</complexType>

<complexType name="Map">

<sequence>

<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/>

</sequence>

</complexType>

</schema>

映射以键/值对序列表示。

java.lang.Object

$1

java.lang.Short

xsd:short

java.lang.String

xsd:string

org.w3c.dom.Document

XML类型,在服务WSDL中定义如下:

<complexType name="XML">

<sequence>

<element maxOccurs="1" minOccurs="0" name="document" type="xsd:string" />

<element maxOccurs="1" minOccurs="0" name="element" type="xsd:string" />

</sequence>

</complexType>

如果AEM Forms服务操作接受org.w3c.dom.Document值,请在XML.document字段中传递XML数据。

设置XML.element字段会导致运行时异常。 如果服务返回org.w3c.dom.Document,则在XML.document字段中返回XML数据。

org.w3c.dom.Element

XML类型,在服务WSDL中定义如下:

<complexType name="XML">

<sequence>

<element maxOccurs="1" minOccurs="0" name="document" type="xsd:string" />

<element maxOccurs="1" minOccurs="0" name="element" type="xsd:string" />

</sequence>

</complexType>

如果AEM Forms服务操作采用org.w3c.dom.Element作为输入,请在XML.element字段中传递XML数据。

设置XML.document字段会导致运行时异常。 如果服务返回org.w3c.dom.Element,则在XML.element字段中重新调整XML数据。

Adobe开发人员网站

Adobe开发人员网站包含以下文章,其中讨论了如何使用Web服务API调用AEM Forms服务:

创建表单渲染ASP.NET应用程序

使用自定义组件调用Web服务

[!NOTE]

使用自定义组件调用Web服务介绍了如何创建调用第三方Web服务的AEM Forms组件。

使用JAX-WS创建Java代理类

可以使用JAX-WS将Forms服务WSDL转换为Java代理类。 这些类允许您调用AEM Forms服务操作。 Apache Ant允许您通过引用AEM Forms服务WSDL创建生成Java代理类的生成脚本。 可通过执行以下步骤来生成JAX-WS代理文件:

  1. 在客户端计算机上安装Apache Ant。 (请参阅https://ant.apache.org/bindownload.cgi。)

    • 将bin目录添加到类路径中。
    • ANT_HOME环境变量设置为安装Ant的目录。
  2. 安装JDK 1.6或更高版本。

    • 将JDK bin目录添加到类路径中。
    • 将JRE bin目录添加到类路径中。 此站位于[JDK_INSTALL_LOCATION]/jre目录中。
    • JAVA_HOME环境变量设置为安装JDK的目录。

    JDK 1.6包含在build.xml文件中使用的wsimport程序。 JDK 1.5不包含该程序。

  3. 在客户端计算机上安装JAX-WS。 (请参阅Java API for XML Web Services。)

  4. 使用JAX-WS和Apache Ant生成Java代理类。 创建Ant构建脚本以完成此任务。 以下脚本是名为build.xml的Ant内部版本脚本示例:

     <?xml version="1.0" encoding="UTF-8"?>
     
     <project basedir="." default="compile">
     
     <property name="port" value="8080" />
     <property name="host" value="localhost" />
     <property name="username" value="administrator" />
     <property name="password" value="password" />
     <property name="tests" value="all" />
     
     <target name="clean" >
            <delete dir="classes" />
     </target>
     
     <target name="wsdl" depends="clean">
            <mkdir dir="classes"/>
            <exec executable="wsimport" failifexecutionfails="false" failonerror="true" resultproperty="foundWSIMPORT">
                <arg line="-keep -d classes https://${host}:${port}/soap/services/EncryptionService?wsdl&lc_version=9.0.1"/>
            </exec>
            <fail unless="foundWSIMPORT">
               !!! Failed to execute JDK's wsimport tool. Make sure that JDK 1.6 (or later) is on your PATH !!!
            </fail>
     </target>
     
     <target name="compile" depends="clean, wsdl" >
          <javac destdir="./classes" fork="true" debug="true">
             <src path="./src"/>
          </javac>
     </target>
     
     <target name="run">
          <java classname="Client" fork="yes" failonerror="true" maxmemory="200M">
             <classpath>
               <pathelement location="./classes"/>
             </classpath>
             <arg value="${port}"/>
             <arg value="${host}"/>
             <arg value="${username}"/>
             <arg value="${password}"/>
             <arg value="${tests}"/>
          </java>
     </target>
     </project>
    

    在此Ant构建脚本中,请注意url属性已设置为引用本地主机上运行的加密服务WSDL。 必须将usernamepassword属性设置为有效的AEM表单用户名和密码。 请注意,URL包含lc_version属性。 如果未指定lc_version选项,则无法调用新的AEM Forms服务操作。

    [!NOTE]

    EncryptionService替换为要使用Java代理类调用的AEM Forms服务名称。 例如,要为Rights Management服务创建Java代理类,请指定:

     http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
    
  5. 创建BAT文件以执行Ant构建脚本。 以下命令可以位于负责执行Ant生成脚本的BAT文件中:

     ant -buildfile "build.xml" wsdl
    

    将ANT内部版本脚本放置在C:\Program Files\Java\jaxws-ri\bin directory目录中。 脚本会将JAVA文件写入。/classes文件夹。 脚本会生成可调用服务的JAVA文件。

  6. 将JAVA文件打包到JAR文件中。 如果您正在使用Eclipse,请执行以下步骤:

    • 创建新的Java项目,用于将代理JAVA文件打包到JAR文件中。
    • 在项目中创建源文件夹。
    • 在Source文件夹中创建com.adobe.idp.services包。
    • 选择com.adobe.idp.services包,然后将JAVA文件从adobe/idp/services文件夹导入包中。
    • 如有必要,请在Source文件夹中创建org/apache/xml/xmlsoap包。
    • 选择源文件夹,然后从org/apache/xml/xmlsoap文件夹导入JAVA文件。
    • 将Java编译器的符合级别设置为5.0或更高。
    • 构建项目。
    • 将项目导出为JAR文件。
    • 将此JAR文件导入客户端项目的类路径中。 此外,还导入位于<安装目录>\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty中的所有JAR文件。

    [!NOTE]

    位于“使用AEM表单编程”中的所有Java Web服务快速入门(Forms服务除外)均使用JAX-WS创建Java代理文件。 此外,所有Java Web服务都可快速启动,使用SwaRef。 (请参阅使用SwaRef调用AEM Forms。)

另请参阅

使用Apache Axis创建Java代理类

使用Base64编码调用AEM Forms

通过HTTP使用BLOB数据调用AEM Forms

使用SwaRef调用AEM Forms

使用Apache Axis创建Java代理类

可以使用Apache Axis WSDL2Java工具将Forms服务转换为Java代理类。 这些类允许您调用Forms服务操作。 使用Apache Ant,可以通过服务WSDL生成轴库文件。 您可以在URL https://ws.apache.org/axis/下载Apache Axis。

[!NOTE]

与Forms服务关联的Web服务快速入门使用使用Apache Axis创建的Java代理类。 Forms Web服务快速入门还使用Base64作为编码类型。 (请参阅Forms服务API快速入门。)

可通过执行以下步骤来生成Axis Java库文件:

  1. 在客户端计算机上安装Apache Ant。 它位于https://ant.apache.org/bindownload.cgi

    • 将bin目录添加到类路径中。
    • ANT_HOME环境变量设置为安装Ant的目录。
  2. 在客户端计算机上安装Apache Axis 1.4。 它位于https://ws.apache.org/axis/

  3. 按照https://ws.apache.org/axis/java/install.html的Axis安装说明中所述,设置类路径以在Web服务客户端中使用Axis JAR文件。

  4. 使用Axis中的Apache WSDL2Java工具生成Java代理类。 创建Ant构建脚本以完成此任务。 以下脚本是名为build.xml的Ant内部版本脚本示例:

     <?xml version="1.0"?>
     <project name="axis-wsdl2java">
     
     <path id="axis.classpath">
     <fileset dir="C:\axis-1_4\lib" >
         <include name="**/*.jar" />
     </fileset>
     </path>
     
     <taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
     
     <target name="encryption-wsdl2java-client" description="task">
     <axis-wsdl2java
         output="C:\JavaFiles"
         testcase="false"
         serverside="false"
         verbose="true"
         username="administrator"
         password="password"
         url="http://localhost:8080/soap/services/EncryptionService?wsdl&lc_version=9.0.1" >
     </axis-wsdl2java>
     </target>
     
     </project>
    

    在此Ant构建脚本中,请注意url属性已设置为引用本地主机上运行的加密服务WSDL。 必须将usernamepassword属性设置为有效的AEM表单用户名和密码。

  5. 创建BAT文件以执行Ant构建脚本。 以下命令可以位于负责执行Ant生成脚本的BAT文件中:

     ant -buildfile "build.xml" encryption-wsdl2java-client
    

    JAVA文件将写入C:\JavaFiles folder as specified by the output属性。 要成功调用Forms服务,请将这些JAVA文件导入类路径。

    默认情况下,这些文件属于名为com.adobe.idp.services的Java包。 建议将这些JAVA文件放入JAR文件中。 然后,将JAR文件导入客户端应用程序的类路径。

    [!NOTE]

    将.JAVA文件放入JAR的方法有所不同。 一种方法是使用Java IDE,如Eclipse。 创建Java项目并创建com.adobe.idp.services包(所有.JAVA文件都属于此包)。 接下来,将所有.JAVA文件导入包中。 最后,将项目导出为JAR文件。

  6. 修改EncryptionServiceLocator类中的URL以指定编码类型。 例如,要使用base64,请指定?blob=base64以确保BLOB对象返回二进制数据。 即,在EncryptionServiceLocator类中,找到以下代码行:

     http://localhost:8080/soap/services/EncryptionService;
    

    并将其更改为:

     http://localhost:8080/soap/services/EncryptionService?blob=base64;
    
  7. 将以下Axis JAR文件添加到Java项目的类路径中:

    • activation.jar
    • axis.jar
    • commons-codec-1.3.jar
    • commons-collections-3.1.jar
    • commons-discovery.jar
    • commons-logging.jar
    • dom3-xml-apis-2.5.0.jar
    • jai_imageio.jar
    • jaxen-1.1 beta-9.jar
    • jaxrpc.jar
    • log4j.jar
    • mail.jar
    • saaj.jar
    • wsdl4j.jar
    • xalan.jar
    • xbean.jar
    • xercesImpl.jar

    这些JAR文件位于[install directory]/Adobe/Adobe Experience Manager Forms/sdk/lib/thirdparty目录中。

另请参阅

使用JAX-WS创建Java代理类

使用Base64编码调用AEM Forms

通过HTTP使用BLOB数据调用AEM Forms

使用Base64编码调用AEM Forms

您可以使用Base64编码调用AEM Forms服务。 Base64编码对随Web服务调用请求发送的附件进行编码。 即,BLOB数据是Base64编码,而不是整个SOAP消息。

“使用Base64编码调用AEM Forms”讨论了使用Base64编码调用以下名为MyApplication/EncryptDocument的AEM Forms短生命周期进程。

[!NOTE]

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

创建使用Base64编码的.NET客户端程序集

您可以创建.NET客户端程序集,以通过Microsoft Visual Studio .NET项目调用Forms服务。 要创建使用base64编码的.NET客户端程序集,请执行以下步骤:

  1. 根据AEM Forms调用URL创建代理类。
  2. 创建一个Microsoft Visual Studio .NET项目,以生成.NET客户端程序集。

创建代理类

您可以使用Microsoft Visual Studio附带的工具创建用于创建.NET客户端程序集的代理类。 该工具的名称为wsdl.exe ,它位于Microsoft Visual Studio安装文件夹中。 要创建代理类,请打开命令提示符,然后导航到包含wsdl.exe文件的文件夹。 有关wsdl.exe工具的详细信息,请参阅​MSDN帮助

在命令提示符下输入以下命令:

 wsdl https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1

默认情况下,此工具会在基于WSDL名称的同一文件夹中创建CS文件。 在这种情况下,它会创建一个名为​EncryptDocumentService.cs​的CS文件。 使用此CS文件创建一个代理对象,用于调用调用URL中指定的服务。

修改代理类中的URL以包含?blob=base64,以确保BLOB对象返回二进制数据。 在代理类中,找到以下代码行:

 "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";

并将其更改为:

 "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";

使用Base64 Encoding​调用AEM Forms部分以MyApplication/EncryptDocument为例。 如果要为另一个Forms服务创建.NET客户端程序集,请确保将MyApplication/EncryptDocument替换为服务的名称。

开发.NET客户端程序集

创建可生成.NET客户端程序集的Visual Studio类库项目。 可以将使用wsdl.exe创建的CS文件导入到此项目中。 此项目会生成一个DLL文件(.NET客户端程序集),您可以在其他Visual Studio .NET项目中使用该文件来调用服务。

  1. 启动Microsoft Visual Studio .NET。
  2. 创建类库项目并将其命名为DocumentService。
  3. 导入使用wsdl.exe创建的CS文件。
  4. 在​项目​菜单中,选择​添加引用
  5. 在“添加引用”对话框中,选择​System.Web.Services.dll
  6. 单击​选择,然后单击​确定
  7. 编译并构建项目。

[!NOTE]

此过程会创建一个名为DocumentService.dll的.NET客户端程序集,您可以使用它向MyApplication/EncryptDocument服务发送SOAP请求。

[!NOTE]

确保将?blob=base64添加到用于创建.NET客户端程序集的代理类中的URL。 否则,无法从BLOB对象检索二进制数据。

引用.NET客户端程序集

将新创建的.NET客户端程序集放置在正在开发客户端应用程序的计算机上。 将.NET客户端程序集放置到目录后,可以从项目中引用它。 另请引用您项目中的System.Web.Services库。 如果不引用此库,则不能使用.NET客户端程序集调用服务。

  1. 在​项目​菜单中,选择​添加引用
  2. 单击​.NET​选项卡。
  3. 单击​Browse​并找到DocumentService.dll文件。
  4. 单击​选择,然后单击​确定

使用使用Base64编码的.NET客户端程序集调用服务

您可以使用使用Base64编码的.NET客户端程序集调用MyApplication/EncryptDocument服务(该服务是在Workbench中构建的)。 要调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 创建使用MyApplication/EncryptDocument服务WSDL的Microsoft .NET客户端程序集。
  2. 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 另请参阅System.Web.Services
  3. 使用Microsoft .NET客户端程序集,通过调用其默认构造函数创建MyApplication_EncryptDocumentService对象。
  4. 使用System.Net.NetworkCredential对象设置MyApplication_EncryptDocumentService对象的Credentials属性。 在System.Net.NetworkCredential构造函数中,指定AEM表单用户名和相应的密码。 设置身份验证值,使您的.NET客户端应用程序能够成功与AEM Forms交换SOAP消息。
  5. 使用BLOB对象的构造函数创建对象。 BLOB对象用于存储传递到MyApplication/EncryptDocument进程的PDF文档。
  6. 通过调用System.IO.FileStream对象的构造函数创建对象。 传递一个字符串值,该值表示PDF文档的文件位置以及打开文件的模式。
  7. 创建用于存储System.IO.FileStream对象内容的字节数组。 您可以通过获取System.IO.FileStream对象的Length属性来确定字节数组的大小。
  8. 通过调用System.IO.FileStream对象的Read方法,使用流数据填充字节数组。 传递字节数组、开始位置和流长度以读取。
  9. 通过为BLOB对象的binaryData属性分配字节数组的内容来填充该对象。
  10. 通过调用MyApplication_EncryptDocumentService对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程会在BLOB对象中返回加密的PDF文档。
  11. 通过调用System.IO.FileStream对象的构造函数并传递表示密码加密文档的文件位置的字符串值,创建对象。
  12. 创建一个字节数组,用于存储MyApplicationEncryptDocumentService对象invoke方法返回的BLOB对象的数据内容。 通过获取BLOB对象binaryData数据成员的值来填充字节数组。
  13. 通过调用System.IO.BinaryWriter对象的构造函数并传递System.IO.FileStream对象来创建该对象。
  14. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组内容写入PDF文件。

使用Java代理类和Base64编码调用服务

您可以使用Java代理类和Base64调用AEM Forms服务。 要使用Java代理类调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

    https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1

    [!NOTE]

    hiro-xp 替换为托管AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 将Java代理JAR文件和JAR文件包含在以下路径中:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到您Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段分配WSDL端点和编码类型。 要使用Base64编码调用MyApplication/EncryptDocument服务,请指定以下URL值:

      https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64

    • 将AEM Forms用户分配给javax.xml.ws.BindingProvider对象的USERNAME_PROPERTY字段。

    • javax.xml.ws.BindingProvider对象的PASSWORD_PROPERTY字段分配相应的密码值。

    以下代码示例显示了此应用程序逻辑:

     //Set connection values required to invoke AEM Forms
     String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
     String username = "administrator";
     String password = "password";
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
    
  7. 通过使用java.io.FileInputStream对象的构造函数创建一个对象,以检索要发送到MyApplication/EncryptDocument进程的PDF文档。 传递指定PDF文档位置的字符串值。

  8. 创建一个字节数组,并使用java.io.FileInputStream对象的内容对其进行填充。

  9. 使用BLOB对象的构造函数创建对象。

  10. 通过调用setBinaryData方法并传递字节数组来填充BLOB对象。 使用Base64编码时,BLOB对象的setBinaryData是调用的方法。 请参阅在服务请求中提供BLOB对象。

  11. 通过调用MyApplicationEncryptDocument对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含PDF文档的BLOB对象。 invoke方法会返回一个BLOB对象,该对象包含加密的PDF文档。

  12. 通过调用BLOB对象的getBinaryData方法,创建包含加密PDF文档的字节数组。

  13. 将加密的PDF文档另存为PDF文件。 将字节数组写入文件。

另请参阅

快速入门:使用Java代理文件和Base64编码调用服务

创建使用Base64编码的.NET客户端程序集

使用MTOM调用AEM Forms

您可以使用Web服务标准MTOM调用AEM Forms服务。 此标准定义二进制数据(如PDF文档)如何通过Internet或内联网传输。 MTOM的一项功能是使用XOP:Include元素。 此元素在XML二进制优化打包(XOP)规范中定义,以引用SOAP消息的二进制附件。

此处讨论的内容是使用MTOM调用以下名为MyApplication/EncryptDocument的AEM Forms短期进程。

[!NOTE]

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

[!NOTE]

在AEM Forms版本9中添加了MTOM支持。

[!NOTE]

使用MTOM传输协议的基于JAX WS的应用程序被限制为25 MB的发送和接收数据。 此限制是由于JAX-WS中存在错误所致。 如果已发送和已接收文件的合计大小超过25MB,请使用SwaRef传输协议,而不是MTOM传输协议。 否则,可能会出现OutOfMemory异常。

此处讨论的内容是在Microsoft .NET项目中使用MTOM来调用AEM Forms服务。 使用的.NET框架为3.5,开发环境为Visual Studio 2008。 如果您的开发计算机上安装了Web服务增强功能(WSE),请将其删除。 .NET 3.5框架支持名为Windows Communication Foundation(WCF)的SOAP框架。 使用MTOM调用AEM Forms时,仅支持WCF(不支持WSE)。

创建使用MTOM调用服务的.NET项目

您可以创建一个Microsoft .NET项目,以使用Web服务调用AEM Forms服务。 首先,使用Visual Studio 2008创建Microsoft .NET项目。 要调用AEM Forms服务,请创建要在项目中调用的AEM Forms服务的服务引用。 创建服务引用时,请指定指向AEM Forms服务的URL:

 http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1

localhost替换为托管AEM Forms的J2EE应用程序服务器的IP地址。 将MyApplication/EncryptDocument替换为要调用的AEM Forms服务的名称。 例如,要调用Rights Management操作,请指定:

http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1

lc_version选项可确保AEM Forms功能(如MTOM)可用。 如果未指定lc_version选项,则无法使用MTOM调用AEM Forms。

创建服务引用后,与AEM Forms服务关联的数据类型可在.NET项目中使用。 要创建调用AEM Forms服务的.NET项目,请执行以下步骤:

  1. 使用Microsoft Visual Studio 2008创建.NET项目。

  2. 在​项目​菜单中,选择​添加服务引用

  3. 在​地址​对话框中,指定AEM Forms服务的WSDL。 例如,

     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    
  4. 单击​Go,然后单击​OK

在.NET项目中使用MTOM调用服务

考虑MyApplication/EncryptDocument流程,该流程接受不安全的PDF文档并返回密码加密的PDF文档。 要使用MTOM调用MyApplication/EncryptDocument进程(在Workbench中构建),请执行以下步骤:

  1. 创建Microsoft .NET项目。

  2. 使用其默认构造函数创建MyApplication_EncryptDocumentClient对象。

  3. 使用System.ServiceModel.EndpointAddress构造函数创建MyApplication_EncryptDocumentClient.Endpoint.Address对象。 将指定WSDL的字符串值传递到AEM Forms服务和编码类型:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
    

    您无需使用lc_version属性。 在创建服务引用时,会使用此属性。 但是,请确保指定?blob=mtom

    [!NOTE]

    hiro-xp 替换为托管AEM Forms的J2EE应用程序服务器的IP地址。

  4. 通过获取EncryptDocumentClient.Endpoint.Binding数据成员的值,创建System.ServiceModel.BasicHttpBinding对象。 将返回值转换为BasicHttpBinding

  5. System.ServiceModel.BasicHttpBinding对象的MessageEncoding数据成员设置为WSMessageEncoding.Mtom。 此值可确保使用MTOM。

  6. 通过执行以下任务,启用基本HTTP身份验证:

    • 将AEM表单用户名分配给数据成员MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
    • 为数据成员MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password分配相应的密码值。
    • 将常量值HttpClientCredentialType.Basic分配给数据成员BasicHttpBindingSecurity.Transport.ClientCredentialType
    • 将常量值BasicHttpSecurityMode.TransportCredentialOnly分配给数据成员BasicHttpBindingSecurity.Security.Mode

    以下代码示例显示了这些任务。

     //Enable BASIC HTTP authentication
     encryptProcess.ClientCredentials.UserName.UserName = "administrator";
     encryptProcess.ClientCredentials.UserName.Password = "password";
     b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
     b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
     b.MaxReceivedMessageSize = 4000000;
     b.MaxBufferSize = 4000000;
     b.ReaderQuotas.MaxArrayLength = 4000000;
    
  7. 使用BLOB对象的构造函数创建对象。 BLOB对象用于存储要传递到MyApplication/EncryptDocument进程的PDF文档。

  8. 通过调用System.IO.FileStream对象的构造函数创建对象。 传递一个字符串值,该值表示PDF文档的文件位置以及打开文件的模式。

  9. 创建用于存储System.IO.FileStream对象内容的字节数组。 您可以通过获取System.IO.FileStream对象的Length属性来确定字节数组的大小。

  10. 通过调用System.IO.FileStream对象的Read方法,使用流数据填充字节数组。 传递字节数组、开始位置和流长度以读取。

  11. 通过为MTOM数据成员分配字节数组的内容来填充BLOB对象。

  12. 通过调用MyApplication_EncryptDocumentClient对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含PDF文档的BLOB对象。 此过程会在BLOB对象中返回加密的PDF文档。

  13. 通过调用System.IO.FileStream对象的构造函数并传递表示安全PDF文档的文件位置的字符串值来创建该对象。

  14. 创建一个字节数组,用于存储invoke方法返回的BLOB对象的数据内容。 通过获取BLOB对象MTOM数据成员的值来填充字节数组。

  15. 通过调用System.IO.BinaryWriter对象的构造函数并传递System.IO.FileStream对象来创建该对象。

  16. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组的内容写入PDF文件。

[!NOTE]

大多数AEM Forms服务操作都具有MTOM快速启动。 您可以在服务的相应快速启动部分中查看这些快速启动。 例如,要查看“输出快速启动”部分,请参阅输出服务API快速启动

另请参阅

快速入门:在.NET项目中使用MTOM调用服务

使用Web服务访问多项服务

创建ASP.NET Web应用程序,该应用程序调用以人为中心的长生命周期流程

使用SwaRef调用AEM Forms

您可以使用SwaRef调用AEM Forms服务。 wsi:swaRef XML元素的内容将作为附件发送到存储对该附件的引用的SOAP主体中。 使用SwaRef调用Forms服务时,请使用Java API for XML Web Services(JAX-WS)创建Java代理类。 (请参阅Java API for XML Web Services。)

这里讨论的是如何使用SwaRef调用以下名为MyApplication/EncryptDocument的Forms短期进程。

[!NOTE]

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

[!NOTE]

AEM Forms中添加了SwaRef支持

下面讨论的是如何在Java客户端应用程序中使用SwaRef调用Forms服务。 Java应用程序使用通过使用JAX-WS创建的代理类。

使用使用SwaRef的JAX-WS库文件调用服务

要使用使用JAX-WS和SwaRef创建的Java代理文件来调用MyApplication/EncryptDocument进程,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    

    有关信息,请参阅使用JAX-WS创建Java代理类。

    [!NOTE]

    hiro-xp 替换为托管AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 将Java代理JAR文件和JAR文件包含在以下路径中:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到您Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段分配WSDL端点和编码类型。 要使用SwaRef编码调用MyApplication/EncryptDocument服务,请指定以下URL值:

       https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref

    • 将AEM Forms用户分配给javax.xml.ws.BindingProvider对象的USERNAME_PROPERTY字段。

    • javax.xml.ws.BindingProvider对象的PASSWORD_PROPERTY字段分配相应的密码值。

    以下代码示例显示了此应用程序逻辑:

     //Set connection values required to invoke AEM Forms
     String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref";
     String username = "administrator";
     String password = "password";
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
    
  7. 通过使用java.io.File对象的构造函数创建一个对象,以检索要发送到MyApplication/EncryptDocument进程的PDF文档。 传递指定PDF文档位置的字符串值。

  8. 使用FileDataSource构造函数创建javax.activation.DataSource对象。 传递java.io.File对象。

  9. 使用其构造函数创建javax.activation.DataHandler对象,并传递javax.activation.DataSource对象。

  10. 使用BLOB对象的构造函数创建对象。

  11. 通过调用setSwaRef方法并传递javax.activation.DataHandler对象来填充BLOB对象。

  12. 通过调用MyApplicationEncryptDocument对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 invoke方法会返回一个BLOB对象,该对象包含加密的PDF文档。

  13. 通过调用BLOB对象的getSwaRef方法来填充javax.activation.DataHandler对象。

  14. 通过调用javax.activation.DataHandler对象的getInputStream方法,将javax.activation.DataHandler对象转换为java.io.InputSteam实例。

  15. java.io.InputSteam实例写入表示加密PDF文档的PDF文件。

[!NOTE]

大多数AEM Forms服务操作都有SwaRef快速启动。 您可以在服务的相应快速启动部分中查看这些快速启动。 例如,要查看“输出快速启动”部分,请参阅输出服务API快速启动

另请参阅

快速入门:在Java项目中使用SwaRef调用服务

通过HTTP使用BLOB数据调用AEM Forms

您可以使用Web服务调用AEM Forms服务,并通过HTTP传递BLOB数据。 通过HTTP传递BLOB数据是替代方法,而不是使用base64编码、DIME或MIME。 例如,在使用Web服务增强3.0(不支持DIME或MIME)的Microsoft .NET项目中,可以通过HTTP传递数据。 通过HTTP使用BLOB数据时,会先上传输入数据,然后再调用AEM Forms服务。

“使用HTTP上的BLOB数据调用AEM Forms”讨论通过通过HTTP传递BLOB数据来调用以下名为MyApplication/EncryptDocument的AEM Forms短生命周期进程。

[!NOTE]

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

[!NOTE]

建议您熟悉使用SOAP调用AEM Forms。 (请参阅使用Web服务调用AEM Forms。)

创建使用HTTP上数据的.NET客户端程序集

要创建通过HTTP使用数据的客户端程序集,请按照使用Base64编码调用AEM Forms中指定的过程操作。 但是,请修改代理类中的URL以包含?blob=http,而不是?blob=base64。 此操作可确保数据通过HTTP进行传递。 在代理类中,找到以下代码行:

 "http://localhost:8080/soap/services/MyApplication/EncryptDocument";

并将其更改为:

 "http://localhost:8080/soap/services/MyApplication/EncryptDocument?blob=http";

引用.NET clienMyApplication/EncryptDocument程序集

将新的.NET客户端程序集放置在正在开发客户端应用程序的计算机上。 将.NET客户端程序集放置到目录后,可以从项目中引用它。 从项目中引用System.Web.Services库。 如果不引用此库,则不能使用.NET客户端程序集调用服务。

  1. 在​项目​菜单中,选择​添加引用
  2. 单击​.NET​选项卡。
  3. 单击​Browse​并找到DocumentService.dll文件。
  4. 单击​选择,然后单击​确定

使用通过HTTP使用BLOB数据的.NET客户端程序集调用服务

您可以使用通过HTTP使用数据的.NET客户端程序集来调用MyApplication/EncryptDocument服务(该服务是在Workbench中构建的)。 要调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 创建.NET客户端程序集。
  2. 引用Microsoft .NET客户端程序集。 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 另请参阅System.Web.Services
  3. 使用Microsoft .NET客户端程序集,通过调用其默认构造函数创建MyApplication_EncryptDocumentService对象。
  4. 使用System.Net.NetworkCredential对象设置MyApplication_EncryptDocumentService对象的Credentials属性。 在System.Net.NetworkCredential构造函数中,指定AEM表单用户名和相应的密码。 设置身份验证值,使您的.NET客户端应用程序能够成功与AEM Forms交换SOAP消息。
  5. 使用BLOB对象的构造函数创建对象。 BLOB对象用于将数据传递到MyApplication/EncryptDocument进程。
  6. BLOB对象的remoteURL数据成员分配一个字符串值,该数据成员指定要传递到MyApplication/EncryptDocument服务的PDF文档的URI位置。
  7. 通过调用MyApplication_EncryptDocumentService对象的invoke方法并传递BLOB对象来调用MyApplication/EncryptDocument进程。 此过程会在BLOB对象中返回加密的PDF文档。
  8. 使用System.UriBuilder对象的构造函数创建一个对象,并传递返回BLOB对象remoteURL数据成员的值。
  9. System.UriBuilder对象转换为System.IO.Stream对象。 (此列表后面的C#快速入门说明了如何执行此任务。)
  10. 创建一个字节数组,然后使用位于System.IO.Stream对象中的数据对其进行填充。
  11. 通过调用System.IO.BinaryWriter对象的构造函数并传递System.IO.FileStream对象来创建该对象。
  12. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组内容写入PDF文件。

通过HTTP使用Java代理类和BLOB数据调用服务

您可以通过HTTP使用Java代理类和BLOB数据来调用AEM Forms服务。 要使用Java代理类调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    

    有关信息,请参阅使用JAX-WS创建Java代理类。

    [!NOTE]

    hiro-xp 替换为托管AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 将Java代理JAR文件和JAR文件包含在以下路径中:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到您Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段分配WSDL端点和编码类型。 要使用BLOB over HTTP编码来调用MyApplication/EncryptDocument服务,请指定以下URL值:

      https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http

    • 将AEM Forms用户分配给javax.xml.ws.BindingProvider对象的USERNAME_PROPERTY字段。

    • javax.xml.ws.BindingProvider对象的PASSWORD_PROPERTY字段分配相应的密码值。

    以下代码示例显示了此应用程序逻辑:

     //Set connection values required to invoke AEM Forms
     String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http";
     String username = "administrator";
     String password = "password";
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
     ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
    
  7. 使用BLOB对象的构造函数创建对象。

  8. 通过调用setRemoteURL方法填充BLOB对象。 传递一个字符串值,该值指定要传递到MyApplication/EncryptDocument服务的PDF文档的URI位置。

  9. 通过调用MyApplicationEncryptDocument对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程会在BLOB对象中返回加密的PDF文档。

  10. 创建字节数组以存储表示加密PDF文档的数据流。 调用BLOB对象的getRemoteURL方法(使用invoke方法返回的BLOB对象)。

  11. 使用java.io.File对象的构造函数创建对象。 此对象表示加密的PDF文档。

  12. 使用其构造函数创建java.io.FileOutputStream对象,并传递java.io.File对象。

  13. 调用java.io.FileOutputStream对象的write方法。 传递包含表示加密PDF文档的数据流的字节数组。

使用DIME调用AEM Forms

您可以使用带有附件的SOAP调用AEM Forms服务。 AEM Forms支持MIME和DIME Web服务标准。 DIME允许您发送二进制附件(如PDF文档)以及调用请求,而不是对附件进行编码。 使用DIME调用AEM Forms​部分讨论了使用DIME调用以下名为MyApplication/EncryptDocument的AEM Forms短期进程。

调用此过程时,会执行以下操作:

  1. 获取传递到流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

此过程不基于现有的AEM Forms进程。 要遵循代码示例,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

[!NOTE]

已弃用使用DIME调用AEM Forms服务操作。 建议您使用MTOM。 (请参阅使用MTOM调用AEM Forms。)

创建使用DIME的.NET项目

要创建可使用DIME调用Forms服务的.NET项目,请执行以下任务:

  • 在开发计算机上安装Web服务增强功能2.0。
  • 在.NET项目中,创建对FormsAEM Forms服务的Web引用。

安装Web服务增强功能2.0

在开发计算机上安装Web服务增强2.0,并将其与Microsoft Visual Studio .NET相集成。 您可以从Microsoft下载中心下载Web服务增强2.0。

从此网页中,搜索Web Services Enhancements 2.0,并将其下载到开发计算机。 此下载会将名为Microsoft WSE 2.0 SPI.msi的文件放置到您的计算机上。 运行安装程序并遵循联机说明。

[!NOTE]

Web服务增强2.0支持DIME。 使用Web服务增强功能2.0时,支持的Microsoft Visual Studio版本是2003年。Web服务增强功能3.0不支持DIME;但是,它支持MTOM。

创建对AEM Forms服务的Web引用

在开发计算机上安装Web服务增强功能2.0并创建Microsoft .NET项目后,请创建对Forms服务的Web引用。 例如,要创建对MyApplication/EncryptDocument进程的Web引用,并假定本地计算机上已安装Forms,请指定以下URL:

     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL

创建Web引用后,可在.NET项目中使用以下两种代理数据类型:EncryptDocumentServiceEncryptDocumentServiceWse。 要使用DIME调用MyApplication/EncryptDocument进程,请使用EncryptDocumentServiceWse类型。

[!NOTE]

在创建对Forms服务的Web引用之前,请确保在项目中引用Web服务增强功能2.0。 (请参阅“安装Web服务增强功能2.0”。)

引用WSE库

  1. 在“项目”菜单中,选择“添加引用”。
  2. 在“添加引用”对话框中,选择Microsoft.Web.Services2.dll。
  3. 选择System.Web.Services.dll。
  4. 单击选择,然后单击确定。

创建对Forms服务的Web引用

  1. 在“项目”菜单中,选择“添加Web引用”。
  2. 在“URL”对话框中,指定指向Forms服务的URL。
  3. 单击开始,然后单击添加引用。

[!NOTE]

确保启用.NET项目以使用WSE库。 在项目资源管理器中,右键单击项目名称并选择启用WSE 2.0。确保选中所显示对话框上的复选框。

在.NET项目中使用DIME调用服务

您可以使用DIME调用Forms服务。 考虑MyApplication/EncryptDocument流程,该流程接受不安全的PDF文档并返回密码加密的PDF文档。 要使用DIME调用MyApplication/EncryptDocument进程,请执行以下步骤:

  1. 创建一个Microsoft .NET项目,使您能够使用DIME调用Forms服务。 确保包含Web服务增强功能2.0并创建对AEM Forms服务的Web引用。

  2. 在设置对MyApplication/EncryptDocument进程的Web引用后,使用其默认构造函数创建EncryptDocumentServiceWse对象。

  3. 使用System.Net.NetworkCredential值设置EncryptDocumentServiceWse对象的Credentials数据成员,该值指定AEM表单用户名和密码值。

  4. 使用Microsoft.Web.Services2.Dime.DimeAttachment对象的构造函数并传递以下值来创建该对象:

    • 指定GUID值的字符串值。 可以通过调用System.Guid.NewGuid.ToString方法来获取GUID值。
    • 指定内容类型的字符串值。 由于此过程需要PDF文档,请指定application/pdf
    • TypeFormat枚举值。 指定TypeFormat.MediaType
    • 一个字符串值,用于指定要传递到AEM Forms进程的PDF文档的位置。
  5. 使用BLOB对象的构造函数创建对象。

  6. 通过将Microsoft.Web.Services2.Dime.DimeAttachment对象的Id数据成员值分配给BLOB对象的attachmentID数据成员,将DIME附件添加到BLOB对象。

  7. 调用EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add方法并传递Microsoft.Web.Services2.Dime.DimeAttachment对象。

  8. 通过调用EncryptDocumentServiceWse对象的invoke方法并传递包含DIME附件的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程会在BLOB对象中返回加密的PDF文档。

  9. 通过获取返回的BLOB对象的attachmentID数据成员的值,获取附件标识符值。

  10. 遍历位于EncryptDocumentServiceWse.ResponseSoapContext.Attachments中的附件,并使用附件标识符值获取加密的PDF文档。

  11. 通过获取Attachment对象Stream数据成员的值,获取System.IO.Stream对象。

  12. 创建一个字节数组,并将该字节数组传递到System.IO.Stream对象的Read方法。 此方法使用表示加密PDF文档的数据流填充字节数组。

  13. 通过调用System.IO.FileStream对象的构造函数并传递表示PDF文件位置的字符串值来创建该对象。 此对象表示加密的PDF文档。

  14. 通过调用System.IO.BinaryWriter对象的构造函数并传递System.IO.FileStream对象来创建该对象。

  15. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组的内容写入PDF文件。

创建使用DIME的Apache Axis Java代理类

可以使用Apache轴WSDL2Java工具将服务WSDL转换为Java代理类,以便调用服务操作。 使用Apache Ant,可以通过AEM Forms服务WSDL生成轴库文件,该WSDL允许您调用该服务。 (请参阅使用Apache Axis创建Java代理类。)

Apache轴WSDL2Java工具会生成JAVA文件,其中包含用于向服务发送SOAP请求的方法。 由服务接收的SOAP请求由Axis生成的库解码,并返回到方法和参数中。

要使用轴生成的库文件和DIME调用MyApplication/EncryptDocument服务(在Workbench中构建),请执行以下步骤:

  1. 使用Apache轴创建使用MyApplication/EncryptDocument服务WSDL的Java代理类。 (请参阅使用Apache Axis创建Java代理类。)

  2. 将Java代理类包含到类路径中。

  3. 使用MyApplicationEncryptDocumentServiceLocator对象的构造函数创建对象。

  4. 使用URL对象的构造函数并传递指定AEM Forms服务WSDL定义的字符串值,以创建对象。 确保在SOAP端点URL的末尾指定?blob=dime。 例如,使用

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
    
  5. 通过调用EncryptDocumentSoapBindingStub对象的构造函数并传递MyApplicationEncryptDocumentServiceLocator对象和URL对象来创建对象。

  6. 通过调用EncryptDocumentSoapBindingStub对象的setUsernamesetPassword方法来设置AEM表单用户名和密码值。

     encryptionClientStub.setUsername("administrator");
     encryptionClientStub.setPassword("password");
    
  7. 通过创建java.io.File对象,检索要发送到MyApplication/EncryptDocument服务的PDF文档。 传递指定PDF文档位置的字符串值。

  8. 使用其构造函数创建javax.activation.DataHandler对象,并传递javax.activation.FileDataSource对象。 javax.activation.FileDataSource对象可通过使用其构造函数并传递表示PDF文档的java.io.File对象来创建。

  9. 使用其构造函数创建org.apache.axis.attachments.AttachmentPart对象,并传递javax.activation.DataHandler对象。

  10. 通过调用EncryptDocumentSoapBindingStub对象的addAttachment方法并传递org.apache.axis.attachments.AttachmentPart对象来附加附件。

  11. 使用BLOB对象的构造函数创建对象。 通过调用BLOB对象的setAttachmentID方法并传递附件标识符值,使用附件标识符值填充BLOB对象。 可以通过调用org.apache.axis.attachments.AttachmentPart对象的getContentId方法来获取此值。

  12. 通过调用EncryptDocumentSoapBindingStub对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含DIME附件的BLOB对象。 此过程会在BLOB对象中返回加密的PDF文档。

  13. 通过调用返回的BLOB对象的getAttachmentID方法获取附件标识符值。 此方法会返回一个字符串值,该值表示返回附件的标识符值。

  14. 通过调用EncryptDocumentSoapBindingStub对象的getAttachments方法检索附件。 此方法会返回表示附件的Objects数组。

  15. 遍历附件(Object数组),然后使用附件标识符值获取加密的PDF文档。 每个元素都是一个org.apache.axis.attachments.AttachmentPart对象。

  16. 通过调用org.apache.axis.attachments.AttachmentPart对象的getDataHandler方法,获取与附件关联的javax.activation.DataHandler对象。

  17. 通过调用javax.activation.DataHandler对象的getInputStream方法来获取java.io.FileStream对象。

  18. 创建一个字节数组,并将该字节数组传递到java.io.FileStream对象的read方法。 此方法使用表示加密PDF文档的数据流填充字节数组。

  19. 使用java.io.File对象的构造函数创建对象。 此对象表示加密的PDF文档。

  20. 使用其构造函数创建java.io.FileOutputStream对象,并传递java.io.File对象。

  21. 调用java.io.FileOutputStream对象的write方法并传递包含表示加密PDF文档的数据流的字节数组。

另请参阅

快速入门:在Java项目中使用DIME调用服务

使用基于SAML的身份验证

AEM Forms在调用服务时支持各种web服务身份验证模式。 一种验证模式是使用Web服务调用中的基本授权标头指定用户名和密码值。 AEM Forms还支持基于SAML断言的身份验证。 当客户端应用程序使用Web服务调用AEM Forms服务时,客户端应用程序可以以下列方式之一提供身份验证信息:

  • 将凭据作为基本授权的一部分传递
  • 将用户名令牌作为WS-Security标头的一部分传递
  • 将SAML断言作为WS-Security标头的一部分传递
  • 将Kerberos令牌作为WS-Security标头的一部分传递

AEM Forms不支持基于证书的标准身份验证,但支持其他形式的基于证书的身份验证。

[!NOTE]

使用AEM Forms进行编程中的Web服务快速入门可指定要执行授权的用户名和密码值。

AEM表单用户的身份可以通过使用密钥签名的SAML断言来表示。 以下XML代码显示了SAML断言的示例。

 <Assertion xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
     xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
     xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
     AssertionID="fd4bd0c87302780e0d9bbfa8726d5bc0" IssueInstant="2008-04-17T13:47:00.720Z" Issuer="LiveCycle"
     MajorVersion="1" MinorVersion="1">
     <Conditions NotBefore="2008-04-17T13:47:00.720Z" NotOnOrAfter="2008-04-17T15:47:00.720Z">
     </Conditions>
     <AuthenticationStatement
         AuthenticationInstant="2008-04-17T13:47:00.720Z"
         AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:unspecified">
         <Subject>
             <NameIdentifier NameQualifier="DefaultDom">administrator</NameIdentifier>
             <SubjectConfirmation>
                 <ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:sender-vouches</ConfirmationMethod>
             </SubjectConfirmation>
         </Subject>
     </AuthenticationStatement>
     <ds:Signature >
         <ds:SignedInfo>
             <ds:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
             <ds:SignatureMethod    Algorithm="https://www.w3.org/2000/09/xmldsig#hmac-sha1"></ds:SignatureMethod>
             <ds:Reference URI="#fd4bd0c87302780e0d9bbfa8726d5bc0">
                 <ds:Transforms>
                     <ds:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
                     <ds:Transform Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#">
                         <ec:InclusiveNamespaces
                             PrefixList="code ds kind rw saml samlp typens #default">
                         </ec:InclusiveNamespaces>
                     </ds:Transform>
                 </ds:Transforms>
                 <ds:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
                 <ds:DigestValue>hVrtqjWr+VzaVUIpQx0YI9lIjaY=</ds:DigestValue>
             </ds:Reference>
         </ds:SignedInfo>
         <ds:SignatureValue>UMbBb+cUcPtcWDCIhXes4n4FxfU=</ds:SignatureValue>
     </ds:Signature>
 </Assertion>

向管理员用户发出此示例断言。 此断言包含以下值得注意的项目:

  • 它在某段持续时间内有效。
  • 它针对特定用户发布。
  • 它经过数字签名。 因此,对它所做的任何修改都会破坏签名。
  • 它可以作为用户身份的令牌显示在AEM Forms中,与用户名和密码类似。

客户端应用程序可以从返回AuthResult对象的任何AEM Forms AuthenticationManager API中检索断言。 您可以通过执行以下两种方法之一来获取AuthResult实例:

  • 使用AuthenticationManager API公开的任何身份验证方法对用户进行身份验证。 通常使用用户名和密码;但是,您也可以使用证书身份验证。
  • 使用AuthenticationManager.getAuthResultOnBehalfOfUser方法。 此方法允许客户端应用程序为任何AEM表单用户获取AuthResult对象。

可以使用获取的SAML令牌对AEM表单用户进行身份验证。 此SAML断言(xml片段)可作为WS-Security标头的一部分发送,该标头包含用户身份验证的Web服务调用。 通常,客户端应用程序已对用户进行了身份验证,但尚未存储用户凭据。 (或者用户已通过除使用用户名和密码之外的其他机制登录到该客户端。) 在这种情况下,客户端应用程序必须调用AEM Forms并模拟允许调用AEM Forms的特定用户。

要模拟特定用户,请使用Web服务调用AuthenticationManager.getAuthResultOnBehalfOfUser方法。 此方法返回一个AuthResult实例,其中包含该用户的SAML断言。

接下来,使用该SAML断言来调用任何需要身份验证的服务。 此操作包括将断言作为SOAP标头的一部分发送。 使用此断言进行Web服务调用时,AEM Forms会将用户标识为该断言所表示的用户。 即,断言中指定的用户是正在调用服务的用户。

使用Apache Axis类和基于SAML的身份验证

您可以通过使用Axis库创建的Java代理类调用AEM Forms服务。 (请参阅使用Apache Axis创建Java代理类。)

使用使用基于SAML的身份验证的AXIS时,请使用Axis注册请求和响应处理程序。 在向AEM Forms发送调用请求之前,Apache Axis会调用处理程序。 要注册处理程序,请创建扩展org.apache.axis.handlers.BasicHandler的Java类。

创建具有轴的断言处理程序

以下名为AssertionHandler.java的Java类显示了扩展org.apache.axis.handlers.BasicHandler的Java类的示例。

 public class AssertionHandler extends BasicHandler {
        public void invoke(MessageContext ctx) throws AxisFault {
            String assertion = (String) ctx.getProperty(LC_ASSERTION);
 
            //no assertion hence nothing to insert
            if(assertion == null) return;
 
            try {
                MessageElement samlElement = new MessageElement(convertToXML(assertion));
                SOAPHeader header = (SOAPHeader) ctx.getRequestMessage().getSOAPHeader();
                //Create the wsse:Security element which would contain the SAML element
                SOAPElement wsseHeader = header.addChildElement("Security", "wsse", WSSE_NS);
                wsseHeader.appendChild(samlElement);
                //remove the actor attribute as in LC we do not specify any actor. This would not remove the actor attribute though
                //it would only remove it from the soapenv namespace
                wsseHeader.getAttributes().removeNamedItem("actor");
            } catch (SOAPException e) {
                throw new AxisFault("Error occured while adding the assertion to the SOAP Header",e);
            }
        }
 }

注册处理程序

要在Axis中注册处理程序,请创建client-config.wsdd文件。 默认情况下,Axis会查找具有此名称的文件。 以下XML代码是client-config.wsdd文件的一个示例。 有关更多信息,请参阅轴文档。

 <deployment xmlns="https://xml.apache.org/axis/wsdd/" xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
     <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
      <globalConfiguration >
       <requestFlow >
        <handler type="java:com.adobe.idp.um.example.AssertionHandler" />
       </requestFlow >
      </globalConfiguration >
 </deployment>
 

调用AEM Forms服务

以下代码示例使用基于SAML的身份验证来调用AEM Forms服务。

 public class ImpersonationExample {
        . . .
        public void  authenticateOnBehalf(String superUsername,String password,
                String canonicalName,String domainName) throws UMException, RemoteException{
            ((org.apache.axis.client.Stub) authenticationManager).setUsername(superUsername);
            ((org.apache.axis.client.Stub) authenticationManager).setPassword(password);
 
            //Step 1 - Invoke the Auth manager api to get an assertion for the user to be impersonated
            AuthResult ar = authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
            String assertion = ar.getAssertion();
            //Step 2 - Setting the assertion here to be picked later by the AssertionHandler. Note that stubs are not threadSafe
            //hence should not be reused. For this simple example we have made them instance variable but care should be taken
            //regarding the thread safety
            ((javax.xml.rpc.Stub) authorizationManager)._setProperty(AssertionHandler.LC_ASSERTION, assertion);
        }
 
        public Role findRole(String roleId) throws UMException, RemoteException{
            //This api would be invoked under bob's user rights
            return authorizationManager.findRole(roleId);
        }
 
        public static void main(String[] args) throws Exception {
            ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
            //Get the SAML assertion for the user to impersonate and store it in stub
            ie.authenticateOnBehalf(
                    "administrator", //The Super user which has the required impersonation permission
                    "password", // Password of the super user as referred above
                    "bob", //Cannonical name of the user to impersonate
                    "testdomain" //Domain of the user to impersonate
                    );
 
            Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
            System.out.println("Role "+r.getName());
        }
 }

使用.NET客户端程序集和基于SAML的身份验证

您可以使用.NET客户端程序集和基于SAML的身份验证来调用Forms服务。 为此,您必须使用Web服务增强功能3.0(WSE)。 有关创建使用WSE的.NET客户端程序集的信息,请参阅创建使用DIME的.NET项目。

[!NOTE]

DIME部分使用WSE 2.0。要使用基于SAML的身份验证,请按照DIME主题中指定的相同说明进行操作。 但是,请将WSE 2.0替换为WSE 3.0。在开发计算机上安装Web服务增强功能3.0,并将其与Microsoft Visual Studio .NET相集成。 您可以从Microsoft下载中心下载Web服务增强3.0。

WSE架构使用策略、断言和SecurityToken数据类型。 对于Web服务调用,请简要指定策略。 一个策略可以有多个断言。 每个断言都可以包含过滤器。 过滤器在Web服务调用的特定阶段被调用,届时,它们可以修改SOAP请求。 有关完整的详细信息,请参阅Web服务增强3.0文档。

创建断言和过滤器

以下C#代码示例创建过滤器和断言类。 此代码示例创建一个SamlAssertionOutputFilter。 在将SOAP请求发送到AEM Forms之前,此过滤器由WSE框架调用。

 class LCSamlPolicyAssertion : Microsoft.Web.ServicES4.Design.PolicyAssertion
 {
        public override Microsoft.Web.ServicES4.SoapFilter CreateClientOutputFilter(FilterCreationContext context)
        {
           return new SamlAssertionOutputFilter();
        }
        . . .
 }
 
 
 class SamlAssertionOutputFilter : SendSecurityFilter
 {
        public override void SecureMessage(SoapEnvelope envelope, Security security)
        {
           // Get the SamlToken from the SessionState
           SamlToken samlToken = envelope.Context.Credentials.UltimateReceiver.GetClientToken<SamlToken>();
           security.Tokens.Add(samlToken);
        }
 }

创建SAML令牌

创建一个类以表示SAML断言。 此类执行的主要任务是将数据值从字符串转换为xml并保留空格。 此断言xml稍后会导入到SOAP请求中。

 class SamlToken : SecurityToken
 {
        public const string SAMLAssertion = "https://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1";
        private XmlElement _assertionElement;
 
        public SamlToken(string assertion)
             : base(SAMLAssertion)
        {
           XmlDocument xmlDoc = new XmlDocument();
           //The white space has to be preserved else the digital signature would get broken
           xmlDoc.PreserveWhitespace = true;
           xmlDoc.LoadXml(assertion);
           _assertionElement = xmlDoc.DocumentElement;
         }
 
         public override XmlElement GetXml(XmlDocument document)
         {
            return (XmlElement)document.ImportNode(_assertionElement, true);
         }
        . . .
 }

调用AEM Forms服务

以下C#代码示例使用基于SAML的身份验证来调用Forms服务。

 public class ImpersonationExample
 {
        . . .
        public void AuthenticateOnBehalf(string superUsername, string password, string canonicalName, string domainName)
        {
            //Create a policy for UsernamePassword Token
            Policy usernamePasswordPolicy = new Policy();
            usernamePasswordPolicy.Assertions.Add(new UsernameOverTransportAssertion());
 
            UsernameToken token = new UsernameToken(superUsername, password, PasswordOption.SendPlainText);
            authenticationManager.SetClientCredential(token);
            authenticationManager.SetPolicy(usernamePasswordPolicy);
 
            //Get the SAML assertion for impersonated user
            AuthClient.AuthenticationManagerService.AuthResult ar
                = authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
            System.Console.WriteLine("Received assertion " + ar.assertion);
 
            //Create a policy for inserting SAML assertion
            Policy samlPolicy = new Policy();
            samlPolicy.Assertions.Add(new LCSamlPolicyAssertion());
            authorizationManager.SetPolicy(samlPolicy);
            //Set the SAML assertion obtained previously as the token
            authorizationManager.SetClientCredential(new SamlToken(ar.assertion));
        }
 
        public Role findRole(string roleId)
        {
            return authorizationManager.findRole(roleId);
        }
 
        static void Main(string[] args)
        {
            ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
            ie.AuthenticateOnBehalf(
                 "administrator", //The Super user which has the required impersonation permission
                 "password", // Password of the super user as referred above
                 "bob", //Cannonical name of the user to impersonate
                 "testdomain" //Domain of the user to impersonate
                 );
 
         Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
            System.Console.WriteLine("Role "+r.name);
     }
 }

有时,在使用Web服务调用某些AEM Forms服务操作时会出现问题。 本讨论的目的是确定这些问题,并提供解决办法(如果有)。

异步调用服务操作

如果尝试异步调用AEM Forms服务操作(如生成PDF的htmlToPDF操作),则会出现SoapFaultException。 要解决此问题,请创建一个自定义绑定XML文件,该文件会将ExportPDF_Result元素和其他元素映射到不同的类中。 以下XML表示自定义绑定文件。

 <bindings
        xmlns:xsd="https://www.w3.org/2001/XMLSchema"
        xmlns:jxb="https://java.sun.com/xml/ns/jaxb" jxb:version="1.0"
        xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/"
      wsdlLocation="http://localhost:8080/soap/services/GeneratePDFService?wsdl&async=true&lc_version=9.0.0"
        xmlns="https://java.sun.com/xml/ns/jaxws">
        <enableAsyncMapping>false</enableAsyncMapping>
        <package name="external_customize.client"/>
        <enableWrapperStyle>true</enableWrapperStyle>
        <bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='ExportPDF_Result']">
            <jxb:class name="ExportPDFAsyncResult">
            </jxb:class>
        </bindings>
        <bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='CreatePDF_Result']">
            <jxb:class name="CreatePDFAsyncResult">
            </jxb:class>
        </bindings>
        <bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='HtmlToPDF_Result']">
            <jxb:class name="HtmlToPDFAsyncResult">
            </jxb:class>
        </bindings>
        <bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='OptimizePDF_Result']">
            <jxb:class name="OptimizePDFAsyncResult">
            </jxb:class>
        </bindings>
        <!--bindings node="//wsdl:portType[@name='GeneratePDFService']/wsdl:operation[@name='HtmlToPDF_Result']">
            <jxb:class name="HtmlToPDFAsyncResult"/>
        </bindings-->
 </bindings>

使用JAX-WS创建Java代理文件时,请使用此XML文件。 (请参阅使用JAX-WS创建Java代理类。)

使用 — b命令行选项执行JAX-WS工具(wsimport.exe)时,请引用此XML文件。 更新绑定XML文件中的wsdlLocation元素以指定AEM Forms的URL。

要确保异步调用正常工作,请修改端点URL值并指定async=true。 例如,对于使用JAX-WS创建的Java代理文件,请为BindingProvider.ENDPOINT_ADDRESS_PROPERTY指定以下内容。

https://server:port/soap/services/ServiceName?wsdl&async=true&lc_version=9.0.0

以下列表指定了异步调用时需要自定义绑定文件的其他服务:

  • PDFG3D
  • 任务管理器
  • 应用程序管理器
  • 目录管理器
  • Distiller
  • 权限管理
  • 文档管理

J2EE应用程序服务器中的差异

有时,使用特定J2EE应用程序服务器创建的代理库无法成功调用托管在其他J2EE应用程序服务器上的AEM Forms。 考虑使用部署在WebSphere上的AEM Forms生成的代理库。 此代理库无法成功调用JBoss应用程序服务器上部署的AEM Forms服务。

与JBoss应用程序服务器相比,在WebSphere上部署AEM Forms时,某些AEM Forms复杂数据类型(如PrincipalReference)的定义方式有所不同。 不同J2EE应用程序服务所使用的JDK的差异是WSDL定义存在差异的原因。 因此,请使用从同一J2EE应用程序服务器中生成的代理库。

使用Web服务访问多项服务

由于命名空间冲突,数据对象无法在多个服务WSDL之间共享。 不同的服务可以共享数据类型,因此服务在WSDL中共享这些类型的定义。 例如,不能将包含BLOB数据类型的两个.NET客户端程序集添加到同一.NET客户端项目。 如果尝试执行此操作,则会出现编译错误。

以下列表指定了无法在多个服务WSDL之间共享的数据类型:

  • User
  • Principals
  • PrincipalReference
  • Groups
  • Roles
  • BLOB

为避免出现此问题,建议您完全确定数据类型。 例如,假定.NET应用程序使用服务引用同时引用Forms服务和签名服务。 两个服务引用都将包含BLOB类。 要使用BLOB实例,请在声明BLOB对象时完全限定该对象。 下面的代码示例中显示了此方法。 有关此代码示例的信息,请参阅对交互式Forms进行数字签名

以下C#代码示例对Forms服务呈现的交互式表单进行签名。 客户端应用程序具有两个服务引用。 与Forms服务关联的BLOB实例属于SignInteractiveForm.ServiceReference2命名空间。 同样,与签名服务关联的BLOB实例属于SignInteractiveForm.ServiceReference1命名空间。 已签名的交互式表单另存为名为​LoanXFASpid.pdf​的PDF文件。

 ???/**
     * Ensure that you create a .NET project that uses
     * MS Visual Studio 2008 and version 3.5 of the .NET
     * framework. This is required to invoke a
     * AEM Forms service using MTOM.
     *
     * For information, see "Invoking AEM Forms using MTOM" in Programming with AEM forms
     */
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.ServiceModel;
 using System.IO;
 
 //A reference to the Signature service
 using SignInteractiveForm.ServiceReference1;
 
 //A reference to the Forms service
 using SignInteractiveForm.ServiceReference2;
 
 namespace SignInteractiveForm
 {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    //Because BLOB objects are used in both service references
                    //it is necessary to fully-qualify the BLOB objects
 
                    //Retrieve the form -- invoke the Forms service
                    SignInteractiveForm.ServiceReference2.BLOB formData = GetForm();
 
                    //Create a BLOB object associated with the Signature service
                    SignInteractiveForm.ServiceReference1.BLOB sigData = new SignInteractiveForm.ServiceReference1.BLOB();
 
                    //Transfer the byte stream from one Forms BLOB object to the
                    //Signature BLOB object
                    sigData.MTOM = formData.MTOM;
 
                    //Sign the Form -- invoke the Signature service
                    SignForm(sigData);
                }
                catch (Exception ee)
                {
                    Console.WriteLine(ee.Message);
                }
            }
 
            //Creates an interactive PDF form based on a XFA form - invoke the Forms service
            private static SignInteractiveForm.ServiceReference2.BLOB GetForm()
            {
 
                try
                {
                    //Create a FormsServiceClient object
                    FormsServiceClient formsClient = new FormsServiceClient();
                    formsClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/FormsService?blob=mtom");
 
                    //Enable BASIC HTTP authentication
                    BasicHttpBinding b = (BasicHttpBinding)formsClient.Endpoint.Binding;
                    b.MessageEncoding = WSMessageEncoding.Mtom;
                    formsClient.ClientCredentials.UserName.UserName = "administrator";
                    formsClient.ClientCredentials.UserName.Password = "password";
                    b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                    b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                    b.MaxReceivedMessageSize = 2000000;
                    b.MaxBufferSize = 2000000;
                    b.ReaderQuotas.MaxArrayLength = 2000000;
 
                    //Create a BLOB to store form data
                    SignInteractiveForm.ServiceReference2.BLOB formData = new SignInteractiveForm.ServiceReference2.BLOB();
                    SignInteractiveForm.ServiceReference2.BLOB pdfForm = new SignInteractiveForm.ServiceReference2.BLOB();
 
                    //Specify a XML form data
                    string path = "C:\\Adobe\Loan.xml";
                    FileStream fs = new FileStream(path, FileMode.Open);
 
                    //Get the length of the file stream
                    int len = (int)fs.Length;
                    byte[] ByteArray = new byte[len];
 
                    fs.Read(ByteArray, 0, len);
                    formData.MTOM = ByteArray;
 
                    //Specify a XML form data
                    string path2 = "C:\\Adobe\LoanSigXFA.pdf";
                    FileStream fs2 = new FileStream(path2, FileMode.Open);
 
                    //Get the length of the file stream
                    int len2 = (int)fs2.Length;
                    byte[] ByteArray2 = new byte[len2];
 
                    fs2.Read(ByteArray2, 0, len2);
                    pdfForm.MTOM = ByteArray2;
 
                    PDFFormRenderSpec renderSpec = new PDFFormRenderSpec();
                    renderSpec.generateServerAppearance = true;
 
                    //Set out parameter values
                    long pageCount = 1;
                    String localValue = "en_US";
                    FormsResult result = new FormsResult();
 
                    //Render an interactive PDF form
                    formsClient.renderPDFForm2(
                        pdfForm,
                        formData,
                        renderSpec,
                        null,
                        null,
                        out pageCount,
                        out localValue,
                        out result);
 
                    //Write the data stream to the BLOB object
                    SignInteractiveForm.ServiceReference2.BLOB outForm = result.outputContent;
                    return outForm;
                }
                catch (Exception ee)
                {
                    Console.WriteLine(ee.Message);
                }
                return null;
            }
 
            //Sign the form -- invoke the Signature service
            private static void SignForm(SignInteractiveForm.ServiceReference1.BLOB inDoc)
            {
 
                try
                {
                    //Create a SignatureServiceClient object
                    SignatureServiceClient signatureClient = new SignatureServiceClient();
                    signatureClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/SignatureService?blob=mtom");
 
                    //Enable BASIC HTTP authentication
                    BasicHttpBinding b = (BasicHttpBinding)signatureClient.Endpoint.Binding;
                    b.MessageEncoding = WSMessageEncoding.Mtom;
                    signatureClient.ClientCredentials.UserName.UserName = "administrator";
                    signatureClient.ClientCredentials.UserName.Password = "password";
                    b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                    b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                    b.MaxReceivedMessageSize = 2000000;
                    b.MaxBufferSize = 2000000;
                    b.ReaderQuotas.MaxArrayLength = 2000000;
 
                    //Specify the name of the signature field
                    string fieldName = "form1[0].grantApplication[0].page1[0].SignatureField1[0]";
 
                    //Create a Credential object
                    Credential myCred = new Credential();
                    myCred.alias = "secure";
 
                    //Specify the reason to sign the document
                    string reason = "The document was reviewed";
 
                    //Specify the location of the signer
                    string location = "New York HQ";
 
                    //Specify contact information
                    string contactInfo = "Tony Blue";
 
                    //Create a PDFSignatureAppearanceOptions object
                    //and show date information
                    PDFSignatureAppearanceOptionSpec appear = new PDFSignatureAppearanceOptionSpec();
                    appear.showDate = true;
 
                    //Sign the PDF document
                    SignInteractiveForm.ServiceReference1.BLOB signedDoc = signatureClient.sign(
                        inDoc,
                        fieldName,
                        myCred,
                        HashAlgorithm.SHA1,
                        reason,
                        location,
                        contactInfo,
                        appear,
                        true,
                        null,
                        null,
                        null);
 
                    //Populate a byte array with BLOB data that represents the signed form
                    byte[] outByteArray = signedDoc.MTOM;
 
                    //Save the signed PDF document
                    string fileName = "C:\\Adobe\LoanXFASigned.pdf";
                    FileStream fs2 = new FileStream(fileName, FileMode.OpenOrCreate);
 
                    //Create a BinaryWriter object
                    BinaryWriter w = new BinaryWriter(fs2);
                    w.Write(outByteArray);
                    w.Close();
                    fs2.Close();
                }
 
                catch (Exception ee)
                {
                    Console.WriteLine(ee.Message);
                }
            }
        }
 }
 
 

以字母I开头的服务会生成无效的代理文件

使用Microsoft .Net 3.5和WCF时,某些AEM Forms生成的代理类的名称不正确。 当为IBMFilenetContentRepositoryConnector、IDPShedulerService或任何其名称以字母I开头的服务创建代理类时,会出现此问题。例如,在IBMFileNetContentRepositoryConnector为BMFileNetContentRepositoryConnectorClient时,生成的客户端的名称。 生成的代理类中缺少字母I。

在此页面上