使用Web服務叫用AEM Forms

服務容器中的大多數AEM Forms服務都配置為公開Web服務,完全支援生成Web服務定義語言(WSDL)。 也就是說,您可以建立代理物件,使用AEM Forms服務的原生SOAP堆疊。 因此,AEM Forms服務可以交換及處理下列SOAP訊息:

  • SOAP請求:由要求動作的用戶端應用程式傳送至Forms服務。
  • SOAP響應:在處理SOAP請求後,由Forms服務傳送至用戶端應用程式。

使用網站服務,您可以執行與使用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支援下列網站服務標準:

  • 編碼:僅支援文檔和常值編碼(根據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_ serverhosts代表托管AEM Forms的J2EE應用程式伺服器的IP位址。
  • your_ port表示J2EE應用程式伺服器使用的HTTP埠。
  • service_ name表示服務名稱。
  • ** version代表服務的目標版本(預設會使用最新服務版本)。
  • async 指定值,以 true 便為非同步調用啟用其他 false 操作(預設)。
  • lc_ version代表您要叫用的AEM Forms版本。

下表列出了服務WSDL定義(假設已在本地主機上部署了AEM Forms,而貼文為8080)。

服務

WSDL定義

組合器

http://localhost:8080/soap/services/ AssemblerService?wsdl

返回和還原

http://localhost:8080/soap/services/BackupService?wsdl

條碼式表單

http://localhost:8080/soap/services/ BarcodedFormsService?wsdl

轉換PDF

http://localhost:8080/soap/services/ ConvertPDFService?wsdl

Distiller

http://localhost:8080/soap/services/ DistillerService?wsdl

DocConverter

http://localhost:8080/soap/services/DocConverterService?WSDL

DocumentManagement

http://localhost:8080/soap/services/DocumentManagementService?WSDL

加密

http://localhost:8080/soap/services/EncryptionService?wsdl

表單

http://localhost:8080/soap/services/FormsService?wsdl

表單資料整合

http://localhost:8080/soap/services/FormDataIntegration?wsdl

產生PDF

http://localhost:8080/soap/services/ GeneratePDFService?wsdl

生成3D PDF

http://localhost:8080/soap/services/Generate3dPDFService?WSDL

輸出

http://localhost:8080/soap/services/ OutputService?wsdl

PDF公用程式

http://localhost:8080/soap/services/ PDFUtilityService?wsdl

Acrobat Reader DC擴充功能

http://localhost:8080/soap/services/ ReaderExtensionsService?wsdl

存放庫

http://localhost:8080/soap/services/ RepositoryService?wsdl

版權管理

http://localhost:8080/soap/services/ RightsManagementService?wsdl

簽名

http://localhost:8080/soap/services/ SignatureService?wsdl

XMP公用程式

http://localhost:8080/soap/services/ XMPUtilityService?wsdl

AEM Forms進程WSDL定義

您必須在WSDL定義中指定應用程式名稱和進程名稱,才能訪問屬於在Workbench中建立的進程的WSDL。 假設應用程式的名稱為MyApplication,且進程的名稱為EncryptDocument。 在這種情況下,請指定以下WSDL定義:

 http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl
注意

有關示例MyApplication/EncryptDocument短期進程的資訊,請參閱短期進程示例

注意

應用程式可以包含資料夾。 在這種情況下,請在WSDL定義中指定資料夾名稱:

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

使用網站服務存取新功能

新的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
注意

設定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物件會傳送二進位資料(例如PDF檔案、XML資料等),並從AEM Forms服務中取得。 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中受支援。 只有在指定包含lc_version屬性的URL時,才可使用這些新欄位。

在服務請求中提供BLOB對象

如果AEM Forms服務操作需要BLOB類型作為輸入值,請在應用程式邏輯中建立BLOB類型的例項。 (許多Web服務快速入門位於​使用AEM表單寫程式​中,說明如何使用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 設為 DIME 或, MIME 以傳回資料作為對應的附件類型,並在欄位中傳回附件識 BLOB.attachmentID 別碼。使用SOAP框架的專有API從附件中讀取資料。
  • 遠端URL:將尾 blob 碼設為 http ,以保留應用程式伺服器上的資料,並傳回欄位中指向資料的 BLOB.remoteURL URL。
  • MTOM或SwaRef:將尾碼 blob 設為 mtom 或, swaref 以相應的附件類型傳回資料,並在或欄位中傳回附 BLOB.MTOM 件識 BLOB.swaRef 別碼。使用SOAP框架的本機API從附件讀取資料。
注意

建議您叫用setBinaryData方法來填入BLOB物件時,不要超過30 MB。 否則,可能會發生OutOfMemory異常。

注意

使用MTOM傳輸協定的基於JAX WS的應用程式限制為25MB的已發送和已接收資料。 此限制是由於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服務會使用Document/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開發人員」網站包含下列文章,討論如何使用網站服務API叫用AEM Forms服務:

建立表單呈現ASP.NET應用程式

使用自訂元件叫用Web服務

注意

使用自訂元件叫用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。 (請參閱XML網站服務的Java API。)

  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服務操作。

    注意

    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檔案中。
    • 在專案中建立來源資料夾。
    • 在源資料夾中建立com.adobe.idp.services包。
    • 選取com.adobe.idp.services套件,然後從adobe/idp/services資料夾將JAVA檔案匯入套件中。
    • 如有必要,請在源資料夾中建立org/apache/xml/xmlsoap包。
    • 選取來源資料夾,然後從org/apache/xml/xmlsoap資料夾匯入JAVA檔案。
    • 將Java編譯器的合規性級別設定為5.0或更高。
    • 建立專案。
    • 將專案匯出為JAR檔案。
    • 將此JAR檔案導入客戶端項目的類路徑。 此外,導入<安裝目錄>\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty中的所有JAR檔案。
    注意

    使用AEM表單寫程式時,位於「使用JAX-WS建立Java代理檔案」中的所有Java Web服務快速啟動(Forms服務除外)。 此外,所有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生成Axis庫檔案。 您可以在URL https://ws.apache.org/axis/下載Apache Axis。

注意

與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. 設定類路徑以在Web服務客戶端中使用Axis JAR檔案,如https://ws.apache.org/axis/java/install.html的Axis安裝說明中所述。

  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檔案導入客戶端應用程式的類路徑。

    注意

    將.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-api-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目錄]/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短期進程。

注意

此程式並非以現有的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建立Proxy類別。
  2. 建立生成.NET客戶端程式集的Microsoft Visual Studio .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對象返回二進位資料。 在Proxy類別中,找出下列程式碼行:

 "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. 在​Project​菜單中,選擇​添加引用
  5. 在添加引用對話框中,選擇​System.Web.Services.dll
  6. 按一下「選擇」,然後按一下「確定」。
  7. 編譯並建置專案。
注意

此過程建立名為DocumentService.dll的.NET客戶端程式集,可用於向MyApplication/EncryptDocument服務發送SOAP請求。

注意

請務必將?blob=base64添加到用於建立.NET客戶端程式集的代理類的URL中。 否則,無法從BLOB對象中檢索二進位資料。

引用.NET客戶端程式集

將新建立的.NET客戶端程式集放置在正在開發客戶端應用程式的電腦上。 將.NET客戶端程式集放置到目錄後,可以從項目中引用它。 也會從專案參考System.Web.Services資料庫。 如果未引用此庫,則不能使用.NET客戶端程式集調用服務。

  1. 在​Project​菜單中,選擇​添加引用
  2. 按一下​.NET​標籤。
  3. 按一下​瀏覽​並找到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. binaryData物件指派包含位元組陣列內容的屬性,以填入BLOB物件。
  10. 調用MyApplication_EncryptDocumentService對象的invoke方法並傳遞包含PDF文檔的BLOB對象,以調用MyApplication/EncryptDocument進程。 此過程在BLOB對象內返回加密的PDF文檔。
  11. 調用System.IO.FileStream對象的建構子並傳遞一個字串值,該字串值表示密碼加密文檔的檔案位置。
  12. 建立位元組陣列,用於儲存MyApplicationEncryptDocumentService對象的invoke方法返回的BLOB對象的資料內容。 獲取BLOB對象的binaryData資料成員的值,以填充位元組陣列。
  13. 通過調用其建構子並傳遞System.IO.FileStream對象來建立System.IO.BinaryWriter對象。
  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

    注意

    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所需的連線值:

    • 將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider對象的ENDPOINT_ADDRESS_PROPERTY欄位。 要使用Base64編碼調用MyApplication/EncryptDocument服務,請指定以下URL值:

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

    • 將AEM表單使用者指派至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物件。 調用方法返回包含加密PDF文檔的BLOB對象。

  12. 調用BLOB對象的getBinaryData方法,建立包含加密PDF文檔的位元組陣列。

  13. 將加密的PDF檔案儲存為PDF檔案。 將位元組陣列寫入檔案。

另請參閱

快速入門:使用Java代理檔案和Base64編碼調用服務

建立使用Base64編碼的.NET客戶端程式集

使用MTOM叫用AEM Forms

您可以使用網站服務標準MTOM叫用AEM Forms服務。 此標準定義了二進位資料(如PDF檔案)如何通過網際網路或內聯網傳輸。 MTOM的一項功能是使用XOP:Include元素。 此元素在XML二進位優化包裝(XOP)規範中定義,以引用SOAP消息的二進位附件。

這裡討論的是使用MTOM來調用以下名為MyApplication/EncryptDocument的AEM Forms短期進程。

注意

此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument的程式。 (請參閱使用Workbench。)

叫用此程式時,會執行下列動作:

  1. 獲取傳遞至流程的不安全PDF文檔。 此操作基於SetValue操作。 此進程的輸入參數是名為inDocdocument進程變數。
  2. 使用密碼加密PDF檔案。 此操作基於PasswordEncryptPDF操作。 在名為outDoc的進程變數中返回密碼加密的PDF文檔。
注意

AEM Forms 9版新增MTOM支援。

注意

使用MTOM傳輸協定的基於JAX WS的應用程式限制為25MB的已發送和已接收資料。 此限制是由於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位址。 以要叫用的AEM Forms服務名稱取代MyApplication/EncryptDocument。 例如,要調用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. 在​Project​菜單中,選擇​添加服務引用

  3. 在​Address​對話框中,指定AEM Forms服務的WSDL。 例如,

     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    
  4. 按一下「Go」,然後按一下「確定」。

在.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

    注意

    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.FileStream對象來建立System.IO.BinaryWriter對象。

  16. 調用System.IO.BinaryWriter對象的Write方法並傳遞位元組陣列,將位元組陣列的內容寫入PDF檔案。

注意

大部分的AEM Forms服務作業都有MTOM快速入門。 您可以在服務的相應快速入門部分中查看這些快速入門。 例如,要查看輸出快速入門部分,請參閱輸出服務API快速入門

另請參閱

快速入門:在.NET項目中使用MTOM調用服務

使用Web服務訪問多個服務

建立ASP.NET Web應用程式,該應用程式調用以人為中心的長生命週期過程

使用SwaRef叫用AEM Forms

您可以使用SwaRef叫用AEM Forms服務。 wsi:swaRef XML元素的內容作為附件在儲存對附件的引用的SOAP主體內發送。 使用SwaRef叫用Forms服務時,請使用XML Web Services(JAX-WS)的Java API建立Java代理類。 (請參閱XML網站服務的Java API。)

這裡討論的是使用SwaRef調用以下名為MyApplication/EncryptDocument的Forms短期進程。

注意

此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument的程式。 (請參閱使用Workbench。)

叫用此程式時,會執行下列動作:

  1. 獲取傳遞至流程的不安全PDF文檔。 此操作基於SetValue操作。 此進程的輸入參數是名為inDocdocument進程變數。
  2. 使用密碼加密PDF檔案。 此操作基於PasswordEncryptPDF操作。 在名為outDoc的進程變數中返回密碼加密的PDF文檔。
注意

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代理類。

    注意

    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所需的連線值:

    • 將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider對象的ENDPOINT_ADDRESS_PROPERTY欄位。 要使用SwaRef編碼調用MyApplication/EncryptDocument服務,請指定以下URL值:

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

    • 將AEM表單使用者指派至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.DataSource物件,以建立javax.activation.DataHandler物件。

  10. 使用其建構子建立BLOB物件。

  11. 叫用setSwaRef方法並傳遞javax.activation.DataHandler物件,以填入BLOB物件。

  12. 調用MyApplicationEncryptDocument對象的invoke方法並傳遞包含PDF文檔的BLOB對象,以調用MyApplication/EncryptDocument進程。 invoke方法返回包含加密PDF文檔的BLOB對象。

  13. 叫用BLOB物件的getSwaRef方法,填入javax.activation.DataHandler物件。

  14. 調用javax.activation.DataHandler對象的getInputStream方法,將javax.activation.DataHandler對象轉換為java.io.InputSteam實例。

  15. java.io.InputSteam實例寫入表示加密PDF文檔的PDF檔案。

注意

大部分的AEM Forms服務操作都有SwaRef快速啟動。 您可以在服務的相應快速入門部分中查看這些快速入門。 例如,要查看輸出快速入門部分,請參閱輸出服務API快速入門

另請參閱

快速入門:在Java項目中使用SwaRef調用服務

使用透過HTTP的BLOB資料叫用AEM Forms

您可以使用網站服務叫用AEM Forms服務,並透過HTTP傳遞BLOB資料。 透過HTTP傳遞BLOB資料是替代技術,而非使用base64編碼、DIME或MIME。 例如,在使用不支援DIME或MIME的Web服務增強3.0的Microsoft .NET專案中,您可以透過HTTP傳遞資料。 透過HTTP使用BLOB資料時,會先上傳輸入資料,再叫用AEM Forms服務。

「使用HTTP上的BLOB資料叫用AEM Forms」討論透過透過HTTP傳遞BLOB資料,以叫用下列名為MyApplication/EncryptDocument的AEM Forms短期處理程式。

注意

此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument的程式。 (請參閱使用Workbench。)

叫用此程式時,會執行下列動作:

  1. 獲取傳遞至流程的不安全PDF文檔。 此操作基於SetValue操作。 此進程的輸入參數是名為inDocdocument進程變數。
  2. 使用密碼加密PDF檔案。 此操作基於PasswordEncryptPDF操作。 在名為outDoc的進程變數中返回密碼加密的PDF文檔。
注意

建議您先熟悉如何使用SOAP叫用AEM Forms。 (請參閱使用網站服務叫用AEM Forms。)

建立使用HTTP資料的.NET客戶端程式集

要建立使用通過HTTP的資料的客戶端程式集,請按照使用Base64編碼調用AEM Forms中指定的過程。 但是,將Proxy類別中的URL修改為包含?blob=http而非?blob=base64。 此動作可確保資料透過HTTP傳遞。 在Proxy類別中,找出下列程式碼行:

 "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. 在​Project​菜單中,選擇​添加引用
  2. 按一下​.NET​標籤。
  3. 按一下​瀏覽​並找到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. 使用其建構子並傳遞傳回BLOB物件的remoteURL資料成員的值,以建立System.UriBuilder物件。
  9. System.UriBuilder物件轉換為System.IO.Stream物件。 (此清單後面的C#快速入門說明了如何執行此任務。)
  10. 建立位元組陣列,並將位於System.IO.Stream物件中的資料填入。
  11. 通過調用其建構子並傳遞System.IO.FileStream對象來建立System.IO.BinaryWriter對象。
  12. 調用System.IO.BinaryWriter對象的Write方法並傳遞位元組陣列,將位元組陣列內容寫入PDF檔案。

通過HTTP調用使用Java代理類和BLOB資料的服務

您可以使用Java代理類和BLOB資料,透過HTTP叫用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代理類。

    注意

    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所需的連線值:

    • 將WSDL端點和編碼類型分配給javax.xml.ws.BindingProvider對象的ENDPOINT_ADDRESS_PROPERTY欄位。 若要使用BLOB over HTTP編碼叫用MyApplication/EncryptDocument服務,請指定以下URL值:

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

    • 將AEM表單使用者指派至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物件。 傳遞一個字串值,該字串值指定PDF文檔的URI位置以傳遞至MyApplication/EncryptDocument服務。

  9. 調用MyApplicationEncryptDocument對象的invoke方法並傳遞包含PDF文檔的BLOB對象,以調用MyApplication/EncryptDocument進程。 此過程在BLOB對象內返回加密的PDF文檔。

  10. 建立位元組陣列,以儲存代表加密PDF檔案的資料流。 調用BLOB對象的getRemoteURL方法(使用invoke方法返回的BLOB對象)。

  11. 使用其建構子建立java.io.File物件。 此對象表示加密的PDF文檔。

  12. 使用其建構子並傳遞java.io.File物件,以建立java.io.FileOutputStream物件。

  13. 調用java.io.FileOutputStream對象的write方法。 傳遞包含代表加密PDF檔案之資料流的位元組陣列。

使用DIME叫用AEM Forms

您可以使用SOAP搭配附件來叫用AEM Forms服務。 AEM Forms支援MIME和DIME網站服務標準。 DIME可讓您傳送二進位附件(例如PDF檔案)以及叫用請求,而非對附件編碼。 使用DIME叫用AEM Forms​一節討論使用DIME叫用以下AEM Forms短期進程MyApplication/EncryptDocument

叫用此程式時,會執行下列動作:

  1. 獲取傳遞至流程的不安全PDF文檔。 此操作基於SetValue操作。 此進程的輸入參數是名為inDocdocument進程變數。
  2. 使用密碼加密PDF檔案。 此操作基於PasswordEncryptPDF操作。 在名為outDoc的進程變數中返回密碼加密的PDF文檔。

此程式並非以現有的AEM Forms程式為基礎。 若要遵循程式碼範例,請使用Workbench建立名為MyApplication/EncryptDocument**的程式。 (請參閱使用Workbench。)

注意

不建議使用DIME叫用AEM Forms服務作業。 建議您使用MTOM。 (請參閱使用MTOM叫用AEM Forms。)

建立使用DIME的.NET項目

要建立可使用DIME調用Forms服務的.NET項目,請執行以下任務:

  • 在您的開發電腦上安裝網站服務增強功能2.0。
  • 從.NET專案內,建立FormsAEM Forms服務的網頁參考。

安裝網站服務增強功能2.0

在您的開發電腦上安裝Web服務增強功能2.0,並將其與Microsoft Visual Studio .NET整合。 您可以從Microsoft下載中心下載Web服務增強2.0。

從此網頁,搜索Web服務增強功能2.0,然後將其下載到您的開發電腦上。 此下載將名為Microsoft WSE 2.0 SPI.msi的檔案放在電腦上。 運行安裝程式,並遵循聯機指示。

注意

網站服務增強功能2.0支援DIME。 使用Web服務增強2.0時,支援的Microsoft Visual Studio版本為2003。Web服務增強3.0不支援DIME;不過,它支援MTOM。

建立AEM Forms服務的網頁參考

在開發電腦上安裝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類型。

注意

在建立Forms服務的網頁參考之前,請務必在專案中參考網站服務增強功能2.0。 (請參閱「安裝網站服務增強功能2.0」。)

參考WSE程式庫

  1. 在「項目」菜單中,選擇「添加引用」。
  2. 在「添加引用」對話框中,選擇Microsoft.Web.Services2.dll。
  3. 選擇System.Web.Services.dll。
  4. 按一下「選擇」,然後按一下「確定」。

建立Forms服務的網頁參考

  1. 在「項目」菜單中,選擇「添加Web引用」。
  2. 在「URL」對話方塊中,指定Forms服務的URL。
  3. 按一下「開始」 ,然後按一下「新增參考」 。
注意

確保啟用.NET項目以使用WSE庫。 在「項目資源管理器」中,按一下右鍵項目名稱並選擇啟用WSE 2.0。確保選中顯示的對話框上的複選框。

在.NET項目中使用DIME調用服務

您可以使用DIME叫用Forms服務。 請考慮MyApplication/EncryptDocument程式,該程式接受不安全的PDF檔案並傳回密碼加密的PDF檔案。 要使用DIME調用MyApplication/EncryptDocument進程,請執行以下步驟:

  1. 建立Microsoft .NET項目,該項目允許您使用DIME調用Forms服務。 請確定您包含網站服務增強功能2.0,並建立AEM Forms服務的網頁參考。

  2. 將Web引用設定為MyApplication/EncryptDocument進程後,使用其預設建構子建立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.FileStream對象來建立System.IO.BinaryWriter對象。

  15. 調用System.IO.BinaryWriter對象的Write方法並傳遞位元組陣列,將位元組陣列的內容寫入PDF檔案。

建立使用DIME的Apache Axis Java代理類

可以使用Apache Axis WSDL2Java工具將服務WSDL轉換為Java代理類,以便調用服務操作。 使用Apache Ant,您可以從AEM Forms服務WSDL生成Axis庫檔案,該WSDL允許您調用該服務。 (請參閱使用Apache Axis建立Java代理類。)

Apache Axis WSDL2Java工具會生成包含用於向服務發送SOAP請求的方法的JAVA檔案。 由服務接收的SOAP請求由Axis生成的庫解碼,並轉回為方法和參數。

要使用軸生成的庫檔案和DIME調用MyApplication/EncryptDocument服務(已在Workbench中構建),請執行以下步驟:

  1. 使用Apache Axis建立使用MyApplication/EncryptDocument服務WSDL的Java代理類。 (請參閱使用Apache Axis建立Java代理類。)

  2. 將Java代理類包含到類路徑中。

  3. 使用其建構子建立MyApplicationEncryptDocumentServiceLocator物件。

  4. 使用其建構子並傳遞指定AEM Forms服務WSDL定義的字串值,以建立URL物件。 請務必在SOAP端點URL的結尾處指定?blob=dime。 例如,使用

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
    
  5. 通過調用其建構子並傳遞MyApplicationEncryptDocumentServiceLocator對象和URL對象來建立EncryptDocumentSoapBindingStub對象。

  6. 叫用EncryptDocumentSoapBindingStub物件的setUsernamesetPassword方法,以設定AEM表單使用者名稱和密碼值。

     encryptionClientStub.setUsername("administrator"); 
     encryptionClientStub.setPassword("password");
    
  7. 通過建立java.io.File對象來檢索要發送到MyApplication/EncryptDocument服務的PDF文檔。 傳遞指定PDF文檔位置的字串值。

  8. 使用其建構子並傳遞javax.activation.FileDataSource物件,以建立javax.activation.DataHandler物件。 javax.activation.FileDataSource物件可使用其建構函式並傳遞代表PDF檔案的java.io.File物件來建立。

  9. 使用其建構子並傳遞javax.activation.DataHandler物件,以建立org.apache.axis.attachments.AttachmentPart物件。

  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.File物件,以建立java.io.FileOutputStream物件。

  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不支援標準憑證式驗證,但支援不同格式的憑證式驗證。

注意

Web服務快速入門於使用AEM Forms進行程式設計,指定用戶名和密碼值以執行授權。

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物件。

AEM表單使用者可使用所取得的SAML代號來驗證。 此SAML斷言(xml片段)可隨Web服務呼叫(用於用戶驗證)一併傳送,作為WS-Security標頭的一部分。 通常,客戶端應用程式已驗證用戶,但未儲存用戶憑據。 (或者,用戶已通過使用用戶名和密碼以外的機制登錄到該客戶端。) 在此情況下,用戶端應用程式必須叫用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註冊請求和回應處理常式。 Apache Axis會先叫用處理常式,再將叫用請求傳送至AEM Forms。 要註冊處理程式,請建立擴展org.apache.axis.handlers.BasicHandler的Java類。

建立軸為的AssertionHandler

以下名為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服務。 要執行此操作,必須使用網站服務增強功能3.0(WSE)。 有關建立使用WSE的.NET客戶端程式集的資訊,請參閱建立使用DIME的.NET項目。

注意

DIME部分使用WSE 2.0。要使用基於SAML的驗證,請遵循在DIME主題中指定的相同說明。 但是,用WSE 3.0替換WSE 2.0。請在開發電腦上安裝Web服務增強功能3.0,並將其與Microsoft Visual Studio .NET整合。 您可以從Microsoft下載中心下載Web服務增強3.0。

WSE體系結構使用策略、斷言和SecurityToken資料類型。 簡短地,對於Web服務呼叫,請指定策略。 策略可以有多個斷言。 每個斷言都可包含篩選器。 在Web服務呼叫的某些階段會叫用篩選器,屆時可以修改SOAP請求。 如需完整詳細資訊,請參閱網站服務增強功能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); 
     } 
 }

使用網站服務叫用特定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應用程式伺服器建立的Proxy程式庫無法成功叫用托管在不同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命名空間。 已簽名的互動式表單將另存為名為​LoanXFASided.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、IDPSschedulerService或任何其名稱以字母I開頭的其他服務建立代理類時,會發生此問題。例如,在IBMFileNetContentRepositoryConnector的情況下,生成的客戶端的名稱為BMFileNetContentRepositoryConnectorClient。 生成的代理類中缺少字母I。

本頁內容