使用網站服務叫用AEM Forms invoking-aem-forms-using-web-services

本檔案中的範例和範例僅適用於JEE環境上的AEM Forms。

服務容器中的大多數AEM Forms服務都設定為公開Web服務,並完整支援產生Web服務定義語言(WSDL)。 也就是說,您可以建立使用AEM Forms服務原生SOAP棧疊的Proxy物件。 因此,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 Basic Profile 1.1規範。 Web Services Interoperability (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 (直接網際網路訊息封裝)。 這些通訊協定是透過SOAP傳送附件的標準方式。 Microsoft Visual Studio .NET應用程式使用DIME。 (請參閱使用Base64編碼叫用AEM Forms。)
  • WS-Security:支援使用者名稱密碼權杖設定檔,這是在WS Security SOAP標頭中傳送使用者名稱和密碼的標準方式。 AEM Forms也支援HTTP基本驗證。 s

若要使用Web服務來叫用AEM Forms服務,通常會建立使用服務WSDL的Proxy程式庫。 使用Web服務叫用AEM Forms ​區段使用JAX-WS來建立Java Proxy類別以叫用服務。 (請參閱使用JAX-WS建立Java Proxy類別。)

您可以指定下列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已部署在本機主機上,且張貼內容為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
檔案管理
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
產生3DPDF
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
Rights Management
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
NOTE
如需範例MyApplication/EncryptDocument短期處理序的相關資訊,請參閱短期處理序範例
NOTE
應用程式可以包含資料夾。 在這種情況下,請在WSDL定義中指定資料夾名稱:
 http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl

使用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物件會傳送二進位資料(例如,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>

只有AEM Forms支援MTOMswaRef欄位。 您必須指定包含lc_version屬性的URL,才能使用這些新欄位。

在服務要求中提供BLOB物件

如果AEM Forms服務操作需要BLOB型別作為輸入值,請在應用程式邏輯中建立BLOB型別的執行個體。 (使用AEM表單 ​進行程式設計時,許多Web服務都會快速啟動,顯示如何使用BLOB資料型別。)

將值指派給屬於BLOB執行個體的欄位,如下所示:

  • Base64:若要以Base64格式編碼的文字傳遞資料,請在BLOB.binaryData欄位中設定資料,並在BLOB.contentType欄位中以MIME格式(例如,application/pdf)設定資料型別。 (請參閱使用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端點是Smart。 如果下列條件為true,則會使用與輸入檔案相同的傳輸通訊協定來傳回輸出檔案:

    • 服務的SOAP端點引數輸出Blob物件的預設通訊協定已設定為Smart。

      對於具有SOAP端點的每個服務,管理控制檯可讓您為任何傳回的blob指定傳輸通訊協定。 (請參閱管理說明。)

    • AEM Forms服務會以一或多個檔案作為輸入。

  3. 服務SOAP端點不是Smart。 設定的通訊協定會決定檔案傳輸通訊協定,而資料會傳回對應的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.MTOMBLOB.swaRef欄位中傳回附件識別碼。 使用SOAP架構的原生API從附件讀取資料。
NOTE
透過叫用其setBinaryData方法填入BLOB物件時,建議您不要超過30 MB。 否則,可能會發生OutOfMemory例外狀況。
NOTE
使用MTOM傳輸通訊協定的JAX WS型應用程式限製為25MB的已傳送及已接收資料。 此限制是由於JAX-WS中的錯誤所導致。 如果傳送和接收的檔案大小總和超過25MB,請使用SwaRef傳輸通訊協定,而不要使用MTOM傳輸通訊協定。 否則,可能會發生OutOfMemory例外狀況。

base64編碼位元組陣列的​ MTOM傳輸

除了BLOB物件之外,MTOM通訊協定還支援任何複雜型別的位元組陣列引數或位元組陣列欄位。 這表示支援MTOM的使用者端SOAP架構可以傳送任何xsd:base64Binary元素做為MTOM附件(而非base64編碼文字)。 AEM Forms SOAP端點可讀取此型別的位元組陣列編碼。 不過,AEM Forms服務一律會傳回位元組陣列型別為base64編碼文字。 輸出位元組陣列引數不支援MTOM。

傳回大量二進位資料的AEM Forms服務會使用Document/BLOB型別,而非位元組陣列型別。 檔案型別在傳輸大量資料時效率更高。

Web服務資料型別 web-service-data-types

下表列出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>

Map是以索引鍵/值配對的序列來表示。

java.lang.Object
$1
java.lang.Short
xsd:short
java.lang.String
xsd:string
org.w3c.dom.Document

在服務WSDL中定義的XML型別,如下所示:

<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

在服務WSDL中定義的XML型別,如下所示:

<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資料。

使用JAX-WS建立Java Proxy類別 creating-java-proxy-classes-using-jax-ws

您可以使用JAX-WS將Forms服務WSDL轉換為Java Proxy類別。 這些類別可讓您叫用AEM Forms服務作業。 Apache Ant可讓您建立建置指令碼,透過參考AEM Forms服務WSDL來產生Java Proxy類別。 您可以執行下列步驟來產生JAX-WS Proxy檔案:

  1. 在使用者端電腦上安裝Apache Ant。 (請參閱https://ant.apache.org/bindownload.cgi。)

    • 將bin目錄新增至類別路徑。
    • ANT_HOME環境變數設定為您安裝Ant的目錄。
  2. 安裝JDK 1.6或更新版本。

    • 將JDK bin目錄新增至類別路徑。
    • 將JRE bin目錄新增至類別路徑。 此bin位於[JDK_INSTALL_LOCATION]/jre目錄中。
    • JAVA_HOME環境變數設定為您安裝JDK的目錄。

    JDK 1.6包含在build.xml檔案中使用的wsimport程式。 JDK 1.5不包含該程式。

  3. 在使用者端電腦上安裝JAX-WS。 (請參閱XML Web服務的Java API。)

  4. 使用JAX-WS和Apache Ant來產生Java Proxy類別。 建立Ant建置指令碼以完成此工作。 下列指令碼是名為build.xml的範例Ant建置指令碼:

    code language-xml
     <?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屬性設定為參照在localhost上執行的加密服務WSDL。 usernamepassword屬性必須設定為有效的AEM表單使用者名稱和密碼。 請注意,URL包含lc_version屬性。 如果不指定lc_version選項,您將無法叫用新的AEM Forms服務作業。

    note note
    NOTE
    EncryptionService取代為您要使用Java Proxy類別叫用的AEM Forms服務名稱。 例如,若要為Rights Management服務建立Java Proxy類別,請指定:
    code language-java
     http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
    
  5. 建立BAT檔案以執行Ant建置指令碼。 下列指令可以位於負責執行Ant建置指令碼的BAT檔案中:

    code language-java
     ant -buildfile "build.xml" wsdl
    

    將ANT建置指令碼放在C:\Program Files\Java\jaxws-ri\bin目錄中。 指令碼會將JAVA檔案寫入。/classes資料夾。 指令碼會產生可呼叫服務的JAVA檔案。

  6. 將JAVA檔案封裝成JAR檔案。 如果您正在使用Eclipse,請遵循下列步驟:

    • 建立用來將Proxy JAVA檔案封裝到JAR檔案中的Java專案。
    • 在專案中建立來源資料夾。
    • 在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 note
    NOTE
    使用AEM表單進行程式設計中的所有Java Web服務快速啟動(Forms服務除外)都會使用JAX-WS建立Java Proxy檔案。 此外,所有Java Web服務都會快速啟動,請使用SwaRef。 (請參閱使用SwaRef叫用AEM Forms。)

另請參閱

使用Apache Axis建立Java Proxy類別

使用Base64編碼叫用AEM Forms

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

使用SwaRef叫用AEM Forms

使用Apache Axis建立Java Proxy類別 creating-java-proxy-classes-using-apache-axis

您可以使用Apache Axis WSDL2Java工具將Forms服務轉換為Java Proxy類別。 這些類別可讓您叫用Forms服務作業。 使用Apache Ant,您可以從服務WSDL產生Axis程式庫檔案。 您可以在URL https://ws.apache.org/axis/下載Apache Axis。

NOTE
與Forms服務相關聯的Web服務快速啟動,會使用使用Apache Axis建立的Java Proxy類別。 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 Proxy類別。 建立Ant建置指令碼以完成此工作。 下列指令碼是名為build.xml的範例Ant建置指令碼:

    code language-java
     <?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屬性設定為參照在localhost上執行的加密服務WSDL。 usernamepassword屬性必須設定為有效的AEM表單使用者名稱和密碼。

  5. 建立BAT檔案以執行Ant建置指令碼。 下列指令可以位於負責執行Ant建置指令碼的BAT檔案中:

    code language-java
     ant -buildfile "build.xml" encryption-wsdl2java-client
    

    JAVA檔案會寫入output屬性所指定的C:\JavaFiles資料夾。 若要成功叫用Forms服務,請將這些JAVA檔案匯入您的類別路徑中。

    依預設,這些檔案屬於名為com.adobe.idp.services的Java套件。 建議您將這些JAVA檔案放入JAR檔案中。 然後將JAR檔案匯入使用者端應用程式的類別路徑中。

    note note
    NOTE
    有不同的方式可以將.JAVA檔案放入JAR中。 一種方法是使用Java IDE,例如Eclipse。 建立Java專案並建立com.adobe.idp.services封裝(所有.JAVA檔案都屬於此封裝)。 接著,將所有.JAVA檔案匯入套件中。 最後,將專案匯出為JAR檔案。
  6. 修改EncryptionServiceLocator類別中的URL以指定編碼型別。 例如,若要使用base64,請指定?blob=base64以確保BLOB物件傳回二進位資料。 也就是說,在EncryptionServiceLocator類別中,找出下列程式碼行:

    code language-java
     http://localhost:8080/soap/services/EncryptionService;
    

    並將其變更為:

    code language-java
     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 Proxy類別

使用Base64編碼叫用AEM Forms

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

使用Base64編碼叫用AEM Forms invoking-aem-forms-using-base64-encoding

您可以使用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作業為基礎。 密碼加密的PDF檔案傳回名為outDoc的程式變數。

建立使用Base64編碼的.NET使用者端元件 creating-a-net-client-assembly-that-uses-base64-encoding

您可以建立.NET使用者端元件,以從Microsoft Visual Studio .NET專案叫用Forms服務。 若要建立使用base64編碼的.NET使用者端元件,請執行下列步驟:

  1. 根據AEM Forms叫用URL建立Proxy類別。
  2. 建立產生.NET使用者端元件的Microsoft Visual Studio .NET專案。

正在建立Proxy類別

您可以使用Microsoft Visual Studio隨附的工具,建立用來建立.NET使用者端元件的Proxy類別。 工具名稱為wsdl.exe,位於Microsoft Visual Studio安裝資料夾中。 若要建立Proxy類別,請開啟命令提示字元並瀏覽至包含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檔案來建立Proxy物件,讓您可以叫用叫用URL中指定的服務。

修改Proxy類別中的URL以包含?blob=base64,以確保BLOB物件傳回二進位資料。 在proxy類別中,找出下列程式碼行:

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

並將其變更為:

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

使用Base64編碼的​ 叫用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使用者端元件,可用來將SOAP要求傳送至MyApplication/EncryptDocument服務。
NOTE
請確定您已將?blob=base64新增至用來建立.NET使用者端元件之Proxy類別中的URL。 否則,您無法從BLOB物件擷取二進位資料。

正在參考.NET使用者端元件

將您新建立的.NET使用者端元件放在您正在開發使用者端應用程式的電腦上。 將.NET使用者端元件放在目錄中之後,可以從專案中參照它。 同時參考專案中的System.Web.Services資料庫。 如果不參考此程式庫,就無法使用.NET使用者端元件來叫用服務。

  1. 在​ 專案 ​功能表中,選取​ 新增參考
  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物件是用來儲存PDF檔案傳遞至MyApplication/EncryptDocument處理序。
  6. 透過叫用它的建構函式來建立System.IO.FileStream物件。 傳遞代表PDF檔案檔案位置和開啟檔案模式的字串值。
  7. 建立位元組陣列以儲存System.IO.FileStream物件的內容。 您可以取得System.IO.FileStream物件的Length屬性來決定位元組陣列的大小。
  8. 呼叫System.IO.FileStream物件的Read方法,以串流資料填入位元組陣列。 傳遞位元組陣列、起始位置以及要讀取的資料流長度。
  9. 以位元組陣列的內容指派物件的binaryData屬性,填入BLOB物件。
  10. 叫用MyApplication/EncryptDocument處理序,方法是叫用MyApplication_EncryptDocumentService物件的invoke方法,並傳遞包含PDF檔案的BLOB物件。 此程式會傳回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 Proxy類別和Base64編碼叫用服務 invoking-a-service-using-java-proxy-classes-and-base64-encoding

您可以使用Java Proxy類別和Base64來叫用AEM Forms服務。 若要使用Java Proxy類別叫用MyApplication/EncryptDocument服務,請執行下列步驟:

  1. 使用使用MyApplication/EncryptDocument服務WSDL的JAX-WS建立Java Proxy類別。 使用下列WSDL端點:

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

    note note
    NOTE
    hiro-xp 取代為主控AEM Forms的J2EE應用程式伺服器的IP位址。
  2. 將使用JAX-WS建立的Java Proxy類別封裝到JAR檔案中。

  3. 請將Java Proxy JAR檔案和JAR檔案加入以下路徑中:

    <安裝目錄>\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欄位。

    下列程式碼範例顯示此應用程式邏輯:

    code language-java
     //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物件。 BLOB物件的setBinaryData是使用Base64編碼時要呼叫的方法。 請參閱在服務要求中提供BLOB物件。

  11. 叫用MyApplicationEncryptDocument物件的invoke方法,以叫用MyApplication/EncryptDocument處理序。 傳遞包含PDF檔案的BLOB物件。 叫用方法傳回包含加密PDF檔案的BLOB物件。

  12. 呼叫BLOB物件的getBinaryData方法,建立包含加密PDF檔案的位元組陣列。

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

另請參閱

快速入門:使用Java Proxy檔案和Base64編碼叫用服務

建立使用Base64編碼的.NET使用者端元件

使用MTOM叫用AEM Forms invoking-aem-forms-using-mtom

您可以使用Web服務標準MTOM來叫用AEM Forms服務。 此標準定義如何透過網際網路或內部網路傳輸二進位資料(例如PDF檔案)。 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作業為基礎。 密碼加密的PDF檔案傳回名為outDoc的程式變數。
NOTE
AEM Forms版本9已新增MTOM支援。
NOTE
使用MTOM傳輸通訊協定的JAX WS型應用程式限製為25MB的已傳送及已接收資料。 此限制是由於JAX-WS中的錯誤所導致。 如果傳送和接收的檔案大小總和超過25MB,請使用SwaRef傳輸通訊協定,而不要使用MTOM傳輸通訊協定。 否則,可能會發生OutOfMemory例外狀況。

此處的討論內容是關於在Microsoft .NET專案中使用MTOM來叫用AEM Forms服務。 使用的.NET Framework是3.5,而開發環境是Visual Studio 2008。 如果您的開發電腦上已安裝Web服務增強功能(WSE),請將其移除。 .NET 3.5架構支援名為Windows Communication Foundation (WCF)的SOAP架構。 使用MTOM叫用AEM Forms時,僅支援WCF (不支援WSE)。

建立使用MTOM叫用服務的.NET專案 creating-a-net-project-that-invokes-a-service-using-mtom

您可以建立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。 例如,

    code language-java
     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    
  4. 按一下​ 執行,然後按一下​ 確定

在.NET專案中使用MTOM叫用服務 invoking-a-service-using-mtom-in-a-net-project

請考慮接受不安全PDF檔案並傳回密碼加密PDF檔案的MyApplication/EncryptDocument程式。 若要使用MTOM叫用MyApplication/EncryptDocument處理序(內建於Workbench),請執行下列步驟:

  1. 建立Microsoft .NET專案。

  2. 使用預設建構函式建立MyApplication_EncryptDocumentClient物件。

  3. 使用System.ServiceModel.EndpointAddress建構函式建立MyApplication_EncryptDocumentClient.Endpoint.Address物件。 將指定WSDL的字串值傳遞至AEM Forms服務與編碼型別:

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

    您不需要使用lc_version屬性。 當您建立服務參考時,會使用此屬性。 不過,請確定您指定了?blob=mtom

    note note
    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

    下列程式碼範例顯示這些工作。

    code language-java
     //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物件是用來儲存PDF檔案,以傳遞至MyApplication/EncryptDocument處理序。

  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檔案。

NOTE
大部分的AEM Forms服務操作都有MTOM快速入門。 您可以在服務的對應快速入門區段中檢視這些快速啟動。 例如,若要檢視輸出快速入門區段,請參閱輸出服務API快速入門

另請參閱

快速入門:在.NET專案中使用MTOM叫用服務

使用網站服務存取多項服務

建立ASP.NET網頁應用程式,叫用以人為中心的長期流程

使用SwaRef叫用AEM Forms invoking-aem-forms-using-swaref

您可以使用SwaRef叫用AEM Forms服務。 wsi:swaRef XML元素的內容會以附件形式傳送到SOAP內文,以儲存附件的參考。 使用SwaRef叫用Forms服務時,請使用適用於XML Web服務的Java API (JAX-WS)建立Java Proxy類別。 (請參閱XML Web服務的Java API。)

此處的討論內容關於使用SwaRef叫用下列名為MyApplication/EncryptDocument的Forms短期處理序。

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

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

  1. 取得傳遞至程式的不安全PDF檔案。 此動作是以SetValue作業為基礎。 此處理序的輸入引數是名為inDocdocument處理序變數。
  2. 使用密碼加密PDF檔案。 此動作是以PasswordEncryptPDF作業為基礎。 密碼加密的PDF檔案傳回名為outDoc的程式變數。
NOTE
AEM Forms新增SwaRef支援

以下討論是關於如何在Java使用者端應用程式中使用SwaRef來叫用Forms服務。 Java應用程式使用使用JAX-WS建立的Proxy類別。

使用使用SwaRef的JAX-WS程式庫檔案叫用服務 invoke-a-service-using-jax-ws-library-files-that-use-swaref

若要使用以JAX-WS和SwaRef建立的Java Proxy檔案來叫用MyApplication/EncryptDocument處理序,請執行下列步驟:

  1. 使用使用MyApplication/EncryptDocument服務WSDL的JAX-WS建立Java Proxy類別。 使用下列WSDL端點:

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

    如需詳細資訊,請參閱使用JAX-WS建立Java Proxy類別

    note note
    NOTE
    hiro-xp 取代為裝載AEM Forms的J2EE應用程式伺服器的IP位址。
  2. 將使用JAX-WS建立的Java Proxy類別封裝到JAR檔案中。

  3. 請將Java Proxy JAR檔案和JAR檔案加入以下路徑中:

    <安裝目錄>\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欄位。

    下列程式碼範例顯示此應用程式邏輯:

    code language-java
     //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. 叫用MyApplication/EncryptDocument處理序,方法是叫用MyApplicationEncryptDocument物件的invoke方法,並傳遞包含PDF檔案的BLOB物件。 叫用方法傳回包含加密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檔案。

NOTE
大部分的AEM Forms服務操作都有SwaRef快速入門。 您可以在服務的對應快速入門區段中檢視這些快速啟動。 例如,若要檢視輸出快速入門區段,請參閱輸出服務API快速入門

另請參閱

快速入門:在Java專案中使用SwaRef叫用服務

透過HTTP使用BLOB資料叫用AEM Forms invoking-aem-forms-using-blob-data-over-http

您可以使用網站服務並透過HTTP傳遞BLOB資料,以叫用AEM Forms服務。 透過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作業為基礎。 密碼加密的PDF檔案傳回名為outDoc的程式變數。
NOTE
建議您先熟悉如何使用SOAP叫用AEM Forms 。 (請參閱使用Web服務叫用AEM Forms。)

建立透過HTTP使用資料的.NET使用者端元件 creating-a-net-client-assembly-that-uses-data-over-http

若要建立透過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. 在​ 專案 ​功能表中,選取​ 新增參考
  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 Proxy類別和BLOB資料叫用服務 invoking-a-service-using-java-proxy-classes-and-blob-data-over-http

您可以透過HTTP使用Java Proxy類別和BLOB資料來叫用AEM Forms服務。 若要使用Java Proxy類別叫用MyApplication/EncryptDocument服務,請執行下列步驟:

  1. 使用使用MyApplication/EncryptDocument服務WSDL的JAX-WS建立Java Proxy類別。 使用下列WSDL端點:

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

    如需詳細資訊,請參閱使用JAX-WS建立Java Proxy類別

    note note
    NOTE
    hiro-xp 取代為裝載AEM Forms的J2EE應用程式伺服器的IP位址。
  2. 將使用JAX-WS建立的Java Proxy類別封裝到JAR檔案中。

  3. 請將Java Proxy JAR檔案和JAR檔案加入以下路徑中:

    <安裝目錄>\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欄位。

    下列程式碼範例顯示此應用程式邏輯:

    code language-java
     //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. 叫用MyApplication/EncryptDocument處理序,方法是叫用MyApplicationEncryptDocument物件的invoke方法,並傳遞包含PDF檔案的BLOB物件。 此程式會傳回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 invoking-aem-forms-using-dime

您可以使用含有附件的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作業為基礎。 密碼加密的PDF檔案傳回名為outDoc的程式變數。

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

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

建立使用DIME的.NET專案 creating-a-net-project-that-uses-dime

若要建立可使用DIME呼叫Forms服務的.NET專案,請執行下列工作:

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

安裝Web服務增強功能2.0

在開發電腦上安裝Web Services Enhancements 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 Services Enhancements 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服務。 請考慮接受不安全PDF檔案並傳回密碼加密PDF檔案的MyApplication/EncryptDocument程式。 若要使用DIME叫用MyApplication/EncryptDocument處理序,請執行下列步驟:

  1. 建立Microsoft .NET專案,讓您使用DIME叫用Forms服務。 請確定您包含網站服務增強功能2.0,並建立AEM Forms服務的網站參考。

  2. 在設定MyApplication/EncryptDocument處理序的Web參照之後,使用預設建構函式來建立EncryptDocumentServiceWse物件。

  3. EncryptDocumentServiceWse物件的Credentials資料成員設定為指定AEM表單使用者名稱和密碼值的System.Net.NetworkCredential值。

  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. 叫用MyApplication/EncryptDocument處理序,方法是叫用EncryptDocumentServiceWse物件的invoke方法,並傳遞包含DIME附件的BLOB物件。 此程式會傳回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 Proxy類別 creating-apache-axis-java-proxy-classes-that-use-dime

您可以使用Apache Axis WSDL2Java工具將服務WSDL轉換為Java Proxy類別,以便呼叫服務作業。 使用Apache Ant,您可以從AEM Forms服務WSDL產生Axis程式庫檔案,讓您叫用該服務。 (請參閱使用Apache Axis建立Java Proxy類別。)

Apache Axis WSDL2Java工具會產生JAVA檔案,其中包含用來將SOAP要求傳送至服務的方法。 服務收到的SOAP要求會由Axis產生的程式庫解碼,並傳回方法和引數。

若要使用Axis產生的程式庫檔案和DIME來叫用MyApplication/EncryptDocument服務(內建於Workbench),請執行下列步驟:

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

  2. 將Java Proxy類別納入您的類別路徑中。

  3. 使用物件的建構函式建立MyApplicationEncryptDocumentServiceLocator物件。

  4. 使用它的建構函式並傳遞指定AEM Forms服務WSDL定義的字串值,來建立URL物件。 請確定您在SOAP端點URL的結尾指定?blob=dime。 例如,使用

    code language-java
     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
    
  5. 建立EncryptDocumentSoapBindingStub物件,方法是叫用其建構函式,並傳遞MyApplicationEncryptDocumentServiceLocator物件和URL物件。

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

    code language-java
     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型驗證 using-saml-based-authentication

叫用服務時,AEM Forms支援各種Web服務驗證模式。 一種驗證模式是使用Web服務呼叫中的基本授權標頭同時指定使用者名稱和密碼值。 AEM Forms也支援SAML宣告式驗證。 當使用者端應用程式使用Web服務叫用AEM Forms服務時,使用者端應用程式可以透過下列其中一種方式提供驗證資訊:

  • 以基本授權的一部分傳遞認證
  • 在WS-Security標頭中傳遞使用者名稱權杖
  • 在WS-Security標頭中傳遞SAML宣告
  • 在WS-Security標頭中傳遞Kerberos權杖

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

AEM表單使用者可使用取得的SAML權杖進行驗證。 此SAML宣告(xml片段)可以作為WS-Security標頭的一部分,連同用於使用者驗證的Web服務呼叫一起傳送。 一般而言,使用者端應用程式已經驗證使用者,但尚未儲存使用者認證。 (或使用者已透過使用使用者名稱和密碼以外的機制登入該使用者端。) 在此情況下,使用者端應用程式必須叫用AEM Forms,並模擬允許叫用AEM Forms的特定使用者。

若要模擬特定使用者,請使用Web服務叫用AuthenticationManager.getAuthResultOnBehalfOfUser方法。 此方法會傳回包含該使用者之SAML宣告的AuthResult執行個體。

接下來,使用該SAML宣告來叫用需要驗證的任何服務。 此動作包括傳送宣告作為SOAP標頭的一部分。 使用此宣告進行Web服務呼叫時,AEM Forms會將使用者識別為該宣告所代表的使用者。 也就是說,宣告中指定的使用者是叫用服務的使用者。

使用Apache Axis類別和SAML型驗證 using-apache-axis-classes-and-saml-based-authentication

您可以透過使用Axis資料庫建立的Java Proxy類別來叫用AEM Forms服務。 (請參閱使用Apache Axis建立Java Proxy類別。)

使用採用SAML型驗證的AXIS時,請使用Axis註冊請求和回應處理常式。 Apache Axis會在傳送叫用要求給AEM Forms之前叫用處理常式。 若要註冊處理常式,請建立擴充org.apache.axis.handlers.BasicHandler的Java類別。

建立Axis為 ​的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檔案的範例。 如需詳細資訊,請參閱Axis檔案。

 <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型驗證 using-a-net-client-assembly-and-saml-based-authentication

您可以使用.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 Services Enhancements 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 Token

建立類別以代表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);
     }
 }

使用網站服務時的相關考量事項 related-considerations-when-using-web-services

有時候,當透過使用網站服務叫用某些AEM Forms服務操作時,會發生問題。 本討論的目標是找出這些問題,並提供解決方案(如果有的話)。

非同步叫用服務作業 invoking-service-operations-asynchronously

如果您嘗試非同步叫用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 Proxy檔案時,請使用此XML檔案。 (請參閱使用JAX-WS建立Java Proxy類別。)

使用 — b命令列選項執行JAX-WS工具(wsimport.exe)時,參考此XML檔案。 更新繫結XML檔案中的wsdlLocation專案,以指定AEM Forms的URL。

若要確保非同步引動運作正常,請修改端點URL值並指定async=true。 例如,對於使用JAX-WS建立的Java Proxy檔案,請為BindingProvider.ENDPOINT_ADDRESS_PROPERTY指定下列專案。

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

下列清單指定以非同步方式叫用時,需要自訂繫結檔案的其他服務:

  • PDFG3D
  • 任務管理員
  • 應用程式管理員
  • 目錄管理員
  • Distiller
  • Rights Management
  • 檔案管理

J2EE應用程式伺服器的差異 differences-in-j2ee-application-servers

有時候,使用特定J2EE應用程式伺服器建立的Proxy程式庫無法成功叫用託管於其他J2EE應用程式伺服器上的AEM Forms。 假設使用WebSphere上部署的AEM Forms產生的Proxy程式庫。 此Proxy程式庫無法成功叫用部署在JBoss應用程式伺服器上的AEM Forms服務。

在WebSphere上部署AEM Forms時,有些AEM Forms複雜資料型別(例如PrincipalReference)的定義與JBoss Application Server不同。 不同J2EE應用程式服務所使用的JDK不同,是WSDL定義有差異的原因。 因此,請使用從相同J2EE應用程式伺服器產生的Proxy程式庫。

使用網站服務存取多項服務 accessing-multiple-services-using-web-services

由於名稱空間衝突,資料物件無法在多個服務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名稱空間。 已簽署的互動式表單會儲存為名為​ LoanXFASigned.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 an 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 an 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);
                }
            }
        }
 }

以字母開頭的服務會產生無效的Proxy檔案 services-starting-with-the-letter-i-produce-invalid-proxy-files

使用Microsoft .Net 3.5和WCF時,某些AEM Forms產生的Proxy類別名稱不正確。 為IBMFilenetContentRepositoryConnector、IDPchedulerService或其名稱以字母I開頭的任何其他服務建立Proxy類別時,就會發生此問題。例如,如果有IBMFileNetContentRepositoryConnector,則產生的使用者端名稱為BMFileNetContentRepositoryConnectorClient。 產生的Proxy類別中缺少字母I。

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2