Chamar o AEM Forms usando serviços da Web invoking-aem-forms-using-web-services
A maioria dos serviços da AEM Forms no contêiner de serviço é configurada para expor um serviço da Web, com suporte total para a geração de WSDL (Web Service Definition Language). Ou seja, você pode criar objetos proxy que consomem a pilha SOAP nativa de um serviço AEM Forms. Como resultado, os serviços da AEM Forms podem trocar e processar as seguintes mensagens SOAP:
- solicitação SOAP: Enviado para um serviço da Forms por um aplicativo cliente solicitando uma ação.
- Resposta SOAP: Enviado para um aplicativo cliente por um serviço da Forms depois que uma solicitação SOAP é processada.
Com os serviços da Web, é possível executar as mesmas operações dos serviços da AEM Forms que você pode usar a API do Java. Uma vantagem de usar serviços da Web para invocar os serviços da AEM Forms é que você pode criar um aplicativo cliente em um ambiente de desenvolvimento compatível com SOAP. Um aplicativo cliente não está vinculado a um ambiente de desenvolvimento específico ou linguagem de programação. Por exemplo, você pode criar um aplicativo cliente usando o Microsoft Visual Studio .NET e C# como a linguagem de programação.
Os serviços da AEM Forms são expostos através do protocolo SOAP e são compatíveis com o Perfil básico WSI 1.1. A WSI (Web Services Interoperability, interoperabilidade de serviços da Web) é uma organização de padrões abertos que promove a interoperabilidade do serviço da Web em todas as plataformas. Para obter mais informações, consulte https://www.ws-i.org/.
O AEM Forms oferece suporte aos seguintes padrões de serviço da Web:
- Codificação: Suporta somente codificação de documento e literal (que é a codificação preferida de acordo com o Perfil básico WSI). (Consulte Chamada de AEM Forms usando codificação Base64.)
- MTOM: Representa uma maneira de codificar anexos com solicitações SOAP. (Consulte Chamar o AEM Forms usando MTOM.)
- SwaRef: Representa outra maneira de codificar anexos com solicitações SOAP. (Consulte Chamar o AEM Forms usando SwaRef.)
- SOAP com anexos: Suporta MIME e DIME (Direct Internet Message Encapsulation). Esses protocolos são formas padrão de enviar anexos por SOAP. Os aplicativos Microsoft Visual Studio .NET usam DIME. (Consulte Chamada de AEM Forms usando codificação Base64.)
- WS-Security: Suporta um perfil de token de senha de nome de usuário, que é uma maneira padrão de enviar nomes de usuário e senhas como parte do cabeçalho SOAP WS Security. O AEM Forms também oferece suporte à autenticação básica HTTP.
Para chamar os serviços da AEM Forms usando um serviço da Web, normalmente você cria uma biblioteca de proxy que consome o serviço WSDL. O Chamar o AEM Forms usando serviços da Web A seção usa o JAX-WS para criar classes proxy Java para chamar serviços. (Consulte Criando classes proxy Java usando JAX-WS.)
Você pode recuperar um WDSL de serviço especificando a seguinte definição de URL (os itens entre colchetes são opcionais):
https://<your_serverhost>:<your_port>/soap/services/<service_name>?wsdl[&version=<version>][&async=true|false][lc_version=<lc_version>]
em que:
- your_serverhost representa o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms.
- your_port representa a porta HTTP que o servidor de aplicativos J2EE usa.
- service_name representa o nome do serviço.
- version representa a versão de destino de um serviço (a versão de serviço mais recente é usada por padrão).
async
especifica o valortrue
para habilitar operações adicionais para invocação assíncrona (false
por padrão).- lc_version representa a versão do AEM Forms que você deseja invocar.
A tabela a seguir lista as definições de WSDL de serviço (supondo que o AEM Forms esteja implantado no host local e a publicação seja 8080).
http://localhost:8080/soap/services/ AssemblerService?wsdl
http://localhost:8080/soap/services/BackupService?wsdl
http://localhost:8080/soap/services/ BarcodedFormsService?wsdl
http://localhost:8080/soap/services/ ConvertPDFService?wsdl
http://localhost:8080/soap/services/ DistillerService?wsdl
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
http://localhost:8080/soap/services/ GeneratePDFService?wsdl
http://localhost:8080/soap/services/Generate3dPDFService?WSDL
http://localhost:8080/soap/services/ OutputService?wsdl
http://localhost:8080/soap/services/ PDFUtilityService?wsdl
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
http://localhost:8080/soap/services/ XMPUtilityService?wsdl
Definições de WSDL do processo AEM Forms
Você deve especificar o nome do Aplicativo e o nome do Processo na definição WSDL para acessar um WSDL que pertence a um processo criado no Workbench. Suponha que o nome do aplicativo seja MyApplication
e o nome do processo é EncryptDocument
. Nessa situação, especifique a seguinte definição de WSDL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl
MyApplication/EncryptDocument
processo de duração curta, consulte Exemplo de processo de duração curta. http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl
Acessar nova funcionalidade usando serviços da Web
A nova funcionalidade do serviço AEM Forms pode ser acessada usando serviços da Web. Por exemplo, no AEM Forms, é introduzida a capacidade de codificar anexos usando MTOM. (Consulte Chamar o AEM Forms usando MTOM.)
Para acessar a nova funcionalidade introduzida no AEM Forms, especifique o lc_version
na definição WSDL. Por exemplo, para acessar a nova funcionalidade do serviço (incluindo o suporte a MTOM), especifique a seguinte definição de WSDL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl&lc_version=9.0.1
lc_version
, certifique-se de usar três dígitos. Por exemplo, 9.0.1 é igual à versão 9.0.Tipo de dados BLOB do serviço da Web
As WSDLs do serviço AEM Forms definem muitos tipos de dados. Um dos tipos de dados mais importantes expostos em um serviço da Web é um BLOB
tipo . Esse tipo de dados mapeia para a com.adobe.idp.Document
ao trabalhar com APIs Java da AEM Forms. (Consulte Passar dados para serviços da AEM Forms usando a API do Java.)
A BLOB
O objeto envia e recupera dados binários (por exemplo, arquivos PDF, dados XML e assim por diante) de e para os serviços da AEM Forms. O BLOB
O tipo é definido em um WSDL de serviço da seguinte maneira:
<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>
O MTOM
e swaRef
são compatíveis somente com o AEM Forms. Você pode usar esses novos campos somente se especificar um URL que inclui a variável lc_version
propriedade.
Fornecimento de objetos BLOB em solicitações de serviço
Se uma operação de serviço AEM Forms exigir um BLOB
digite como um valor de entrada, crie uma instância do BLOB
digite a lógica do aplicativo. (Muitas das inicializações rápidas do serviço da Web estão localizadas em Programação com formulários AEM mostrar como trabalhar com um tipo de dados BLOB.)
Atribua valores a campos que pertencem à variável BLOB
instância da seguinte maneira:
- Base64: Para passar dados como texto codificado em um formato Base64, defina os dados no
BLOB.binaryData
e definir o tipo de dados no formato MIME (por exemplo,application/pdf
) naBLOB.contentType
campo. (Consulte Chamada de AEM Forms usando codificação Base64.) - MTOM: Para transmitir dados binários em um anexo MTOM, defina os dados no
BLOB.MTOM
campo. Essa configuração anexa os dados à solicitação SOAP usando a estrutura Java JAX-WS ou a API nativa da estrutura SOAP. (Consulte Chamar o AEM Forms usando MTOM.) - SwaRef: Para transmitir dados binários em um anexo WS-I SwaRef, defina os dados no
BLOB.swaRef
campo. Essa configuração anexa os dados à solicitação SOAP usando a estrutura Java JAX-WS. (Consulte Chamar o AEM Forms usando SwaRef.) - anexo MIME ou DIME: Para transmitir dados em um anexo MIME ou DIME, anexe os dados à solicitação SOAP usando a API nativa da estrutura SOAP. Defina o identificador do anexo na função
BLOB.attachmentID
campo. (Consulte Chamada de AEM Forms usando codificação Base64.) - URL remoto: Se os dados forem hospedados em um servidor da Web e acessíveis por meio de um URL HTTP, defina o URL HTTP no
BLOB.remoteURL
campo. (Consulte Chamada de AEM Forms usando dados BLOB sobre HTTP.)
Acesso a dados em objetos BLOB retornados de serviços
O protocolo de transmissão para retornado BLOB
Os objetos dependem de vários fatores, que são considerados na seguinte ordem, interrompendo quando a condição principal for atendida:
-
O URL de destino especifica o protocolo de transmissão. Se o URL de destino especificado na invocação SOAP contiver o parâmetro
blob="
BLOB_TYPE", então BLOB_TYPE determina o protocolo de transmissão. BLOB_TYPE é um espaço reservado para base64, dime, mime, http, mtom ou swaref. -
O ponto de extremidade SOAP do serviço é inteligente. Se as condições a seguir forem verdadeiras, os documentos de saída serão retornados usando o mesmo protocolo de transmissão que os documentos de entrada:
-
O parâmetro de ponto de extremidade SOAP do serviço Protocolo Padrão para Objetos Blob de Saída está definido como Inteligente.
Para cada serviço com um terminal SOAP, o console de administração permite especificar o protocolo de transmissão para os blobs retornados. (Consulte ajuda administrativa.)
-
O serviço AEM Forms utiliza um ou mais documentos como entrada.
-
-
O ponto de extremidade SOAP de serviço não é inteligente. O protocolo configurado determina o protocolo de transmissão do documento e os dados são retornados no protocolo correspondente
BLOB
campo. Por exemplo, se o ponto de extremidade SOAP estiver definido como DIME, o blob retornado estará noblob.attachmentID
independentemente do protocolo de transmissão de qualquer documento de entrada. -
Caso contrário. Se um serviço não tomar o tipo de documento como entrada, os documentos de saída serão retornados na
BLOB.remoteURL
sobre o protocolo HTTP.
Conforme descrito na primeira condição, é possível garantir o tipo de transmissão para quaisquer documentos retornados estendendo o URL do ponto de extremidade SOAP com um sufixo, da seguinte maneira:
https://<your_serverhost>:<your_port>/soap/services/<service
name>?blob=base64|dime|mime|http|mtom|swaref
Esta é a correlação entre os tipos de transmissão e o campo a partir do qual você obtém os dados:
- Formato Base64: Defina as
blob
sufixo parabase64
para retornar os dados noBLOB.binaryData
campo. - anexo MIME ou DIME: Defina as
blob
sufixo paraDIME
ouMIME
para retornar os dados como um tipo de anexo correspondente com o identificador de anexo retornado noBLOB.attachmentID
campo. Use a API proprietária da estrutura SOAP para ler os dados do anexo. - URL remoto: Defina as
blob
sufixo parahttp
para manter os dados no servidor de aplicativos e retornar o URL apontando para os dados noBLOB.remoteURL
campo. - MTOM ou SwaRef: Defina as
blob
sufixo paramtom
ouswaref
para retornar os dados como um tipo de anexo correspondente com o identificador de anexo retornado noBLOB.MTOM
ouBLOB.swaRef
campos. Use a API nativa da estrutura SOAP para ler os dados do anexo.
BLOB
ao invocar seu setBinaryData
método . Caso contrário, há a possibilidade de que uma OutOfMemory
* ocorre exceção.*OutOfMemory
* exceção.*Transmissão MTOM de matrizes de bytes codificadas em base64
Além do BLOB
, o protocolo MTOM suporta qualquer parâmetro de matriz de bytes ou campo de matriz de bytes de um tipo complexo. Isso significa que as estruturas SOAP do cliente compatíveis com MTOM podem enviar qualquer xsd:base64Binary
elemento como um anexo MTOM (em vez de um texto codificado em base64). Os pontos de extremidade SOAP AEM Forms podem ler esse tipo de codificação de matriz de bytes. No entanto, o serviço AEM Forms sempre retorna um tipo de matriz de bytes como um texto codificado em base64. Os parâmetros da matriz de bytes de saída não são compatíveis com MTOM.
Os serviços da AEM Forms que retornam uma grande quantidade de dados binários usam o tipo Documento/BLOB em vez do tipo de matriz de bytes. O tipo de documento é muito mais eficiente para transmitir grandes quantidades de dados.
Tipos de dados do serviço da Web web-service-data-types
A tabela a seguir lista os tipos de dados Java e mostra o tipo de dados do serviço da Web correspondente.
java.lang.byte[]
xsd:base64Binary
java.lang.Boolean
xsd:boolean
java.util.Date
O DATE
tipo , que é definido em um WSDL de serviço da seguinte maneira:
<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>
Se uma operação de serviço AEM Forms utiliza um java.util.Date
como entrada, o aplicativo cliente SOAP deve passar a data no DATE.date
campo. Definir a DATE.calendar
nesse caso, causa uma exceção de tempo de execução. Se o serviço retornar um java.util.Date
, a data é retornada na variável DATE.date
campo.
java.util.Calendar
O DATE
tipo , que é definido em um WSDL de serviço da seguinte maneira:
<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>
Se uma operação de serviço AEM Forms utiliza um java.util.Calendar
como entrada, o aplicativo cliente SOAP deve passar a data no DATE.caledendar
campo. Definir a DATE.date
nesse caso, causa uma exceção de tempo de execução. Se o serviço retornar um java.util.Calendar
, a data é retornada na variável DATE.calendar
campo.
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
O apachesoap:Map
, que é definido em um WSDL de serviço como segue:
<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>
O Mapa é representado como uma sequência de pares de chave/valor.
java.lang.Object
$1
java.lang.Short
xsd:short
java.lang.String
xsd:string
org.w3c.dom.Document
O tipo XML, que é definido em um WSDL de serviço da seguinte maneira:
<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>
Se uma operação de serviço da AEM Forms aceitar uma org.w3c.dom.Document
passe os dados XML no XML.document
campo.
Definir a XML.element
causa uma exceção de tempo de execução. Se o serviço retornar um org.w3c.dom.Document
, os dados XML são retornados na variável XML.document
campo.
org.w3c.dom.Element
O tipo XML, que é definido em um WSDL de serviço da seguinte maneira:
<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>
Se uma operação de serviço AEM Forms utiliza um org.w3c.dom.Element
como entrada, passe os dados XML no XML.element
campo.
Definir a XML.document
causa uma exceção de tempo de execução. Se o serviço retornar um org.w3c.dom.Element
, os dados XML são retornados na variável XML.element
campo.
Criando classes proxy Java usando JAX-WS creating-java-proxy-classes-using-jax-ws
Você pode usar o JAX-WS para converter um WSDL de serviço da Forms em classes proxy Java. Essas classes permitem que você chame as operações dos serviços da AEM Forms. O Apache Ant permite criar um script de criação que gera classes proxy Java referenciando um WSDL do serviço AEM Forms. Você pode gerar arquivos proxy JAX-WS executando as seguintes etapas:
-
Instale o Apache Ant no computador cliente. (Consulte https://ant.apache.org/bindownload.cgi.)
- Adicione o diretório bin ao caminho da classe.
- Defina as
ANT_HOME
variável de ambiente no diretório em que você instalou o Ant.
-
Instale o JDK 1.6 ou posterior.
- Adicione o diretório JDK bin ao caminho da classe.
- Adicione o diretório JRE bin ao caminho da classe. Esse compartimento está localizado na [JDK_INSTALL_LOCATION] diretório /jre.
- Defina as
JAVA_HOME
variável de ambiente no diretório em que você instalou o JDK.
O JDK 1.6 inclui o programa wsimport usado no arquivo build.xml. O JDK 1.5 não inclui esse programa.
-
Instale o JAX-WS no computador cliente. (Consulte API Java para serviços XML da Web.)
-
Use JAX-WS e Apache Ant para gerar classes proxy Java. Crie um script de criação Ant para realizar essa tarefa. O script a seguir é um exemplo de script de compilação Ant chamado build.xml:
code language-as3 <?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>
Nesse script de criação Ant, observe que a variável
url
é definida para fazer referência ao WSDL do serviço de criptografia em execução no host local. Ousername
epassword
As propriedades devem ser definidas com um nome de usuário e senha válidos para formulários AEM. Observe que o URL contém a variávellc_version
atributo. Sem especificar olc_version
não é possível chamar novas operações do serviço AEM Forms.note note NOTE Substituir EncryptionService
* com o nome do serviço AEM Forms que você deseja invocar usando classes proxy Java. Por exemplo, para criar classes proxy Java para o serviço Rights Management, especifique:*code language-as3 http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
-
Crie um arquivo BAT para executar o script de compilação Ant. O seguinte comando pode ser localizado em um arquivo BAT responsável pela execução do script de compilação Ant:
code language-as3 ant -buildfile "build.xml" wsdl
Coloque o script de build ANT no diretório C:\Program Files\Java\jaxws-ri\bin directory. O script grava os arquivos JAVA no .pasta /classes. O script gera arquivos JAVA que podem chamar o serviço.
-
Compacte os arquivos JAVA em um arquivo JAR. Se estiver trabalhando com o Eclipse, siga estas etapas:
- Crie um novo projeto Java usado para empacotar os arquivos JAVA de proxy em um arquivo JAR.
- Crie uma pasta de origem no projeto.
- Crie um
com.adobe.idp.services
na pasta Origem. - Selecione o
com.adobe.idp.services
e, em seguida, importe os arquivos JAVA da pasta adobe/idp/services para o pacote. - Se necessário, crie uma
org/apache/xml/xmlsoap
na pasta Origem. - Selecione a pasta de origem e importe os arquivos JAVA da pasta org/apache/xml/xmlsoap.
- Defina o nível de conformidade do compilador Java para 5.0 ou superior.
- Crie o projeto.
- Exporte o projeto como um arquivo JAR.
- Importe este arquivo JAR no caminho de classe de um projeto cliente. Além disso, importe todos os arquivos JAR localizados em <install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty.
note note NOTE Todas as inicializações rápidas do serviço da Web Java (exceto o serviço Forms) localizadas em Programação com AEM formulários criam arquivos proxy Java usando JAX-WS. Além disso, todos os serviços da Web Java são iniciados rapidamente, use SwaRef. (Consulte Chamar o AEM Forms usando SwaRef.)
Consulte também
Criação de classes proxy Java usando o Apache Axis
Chamada de AEM Forms usando codificação Base64
Chamada de AEM Forms usando dados BLOB sobre HTTP
Chamar o AEM Forms usando SwaRef
Criação de classes proxy Java usando o Apache Axis creating-java-proxy-classes-using-apache-axis
Você pode usar a ferramenta Apache Axis WSDL2Java para converter um serviço Forms em classes proxy Java. Essas classes permitem que você chame as operações do serviço Forms. Usando o Apache Ant, você pode gerar arquivos de biblioteca do Axis a partir de um WSDL de serviço. Você pode baixar o Apache Axis no URL https://ws.apache.org/axis/.
Você pode gerar arquivos de biblioteca Java do Axis executando as seguintes etapas:
-
Instale o Apache Ant no computador cliente. Está disponível em https://ant.apache.org/bindownload.cgi.
- Adicione o diretório bin ao caminho da classe.
- Defina as
ANT_HOME
variável de ambiente no diretório em que você instalou o Ant.
-
Instale o Apache Axis 1.4 no computador cliente. Está disponível em https://ws.apache.org/axis/.
-
Configure o caminho da classe para usar os arquivos JAR do Axis no cliente do serviço da Web, conforme descrito nas instruções de instalação do Axis em https://ws.apache.org/axis/java/install.html.
-
Use a ferramenta Apache WSDL2Java no Axis para gerar classes proxy Java. Crie um script de criação Ant para realizar essa tarefa. O script a seguir é um exemplo de script de compilação Ant chamado build.xml:
code language-as3 <?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>
Nesse script de criação Ant, observe que a variável
url
é definida para fazer referência ao WSDL do serviço de criptografia em execução no host local. Ousername
epassword
As propriedades devem ser definidas com um nome de usuário e senha válidos para formulários AEM. -
Crie um arquivo BAT para executar o script de compilação Ant. O seguinte comando pode ser localizado em um arquivo BAT responsável pela execução do script de compilação Ant:
code language-as3 ant -buildfile "build.xml" encryption-wsdl2java-client
Os arquivos JAVA são gravados no diretório C:\JavaFiles folder as specified by the
output
propriedade. Para chamar com êxito o serviço Forms, importe esses arquivos JAVA para o caminho da classe.Por padrão, esses arquivos pertencem a um pacote Java chamado
com.adobe.idp.services
. É recomendável colocar esses arquivos JAVA em um arquivo JAR. Em seguida, importe o arquivo JAR para o caminho de classe do seu aplicativo cliente.note note NOTE Há diferentes maneiras de colocar arquivos .JAVA em um JAR. Uma maneira é usar um Java IDE como o Eclipse. Crie um projeto Java e crie um com.adobe.idp.services
* pacote (todos os arquivos .JAVA pertencem a esse pacote). Em seguida, importe todos os arquivos .JAVA para o pacote. Por fim, exporte o projeto como um arquivo JAR.* -
Altere o URL no
EncryptionServiceLocator
classe para especificar o tipo de codificação. Por exemplo, para usar base64, especifique?blob=base64
para assegurar queBLOB
retorna dados binários. Ou seja, noEncryptionServiceLocator
localize a seguinte linha de código:code language-as3 http://localhost:8080/soap/services/EncryptionService;
e alterá-lo para:
code language-as3 http://localhost:8080/soap/services/EncryptionService?blob=base64;
-
Adicione os seguintes arquivos Axis JAR ao caminho de classe do seu projeto 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_imagio.jar
- jaxen-1.1-beta-9.jar
- jaxrpc.jar
- log4j.jar
- mail.jar
- saaj.jar
- wsdl4j.jar
- xalan.jar
- xbean.jar
- xercesImpl.jar
Esses arquivos JAR estão na [diretório de instalação]/Adobe/Adobe Experience Manager Forms/sdk/lib/diretório de terceiros.
Consulte também
Criando classes proxy Java usando JAX-WS
Chamada de AEM Forms usando codificação Base64
Chamada de AEM Forms usando dados BLOB sobre HTTP
Chamada de AEM Forms usando codificação Base64 invoking-aem-forms-using-base64-encoding
Você pode chamar um serviço AEM Forms usando a codificação Base64. Codificação Base64 codifica anexos que são enviados com uma solicitação de invocação de serviço da Web. Ou seja, BLOB
Os dados são codificados em Base64, não na mensagem SOAP inteira.
"Chamar o AEM Forms usando a codificação Base64" discute chamar o seguinte processo de curta duração do AEM Forms chamado MyApplication/EncryptDocument
usando a codificação Base64.
MyApplication/EncryptDocument
usando o Workbench. (Consulte Uso do Workbench.)Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento PDF não seguro passado para o processo. Essa ação se baseia na variável
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo nomeadainDoc
. - Criptografa o documento PDF com uma senha. Essa ação se baseia na variável
PasswordEncryptPDF
operação. O documento PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
Criando um assembly de cliente .NET que usa codificação Base64 creating-a-net-client-assembly-that-uses-base64-encoding
Você pode criar um assembly de cliente .NET para chamar um serviço Forms de um projeto Microsoft Visual Studio .NET. Para criar um assembly de cliente .NET que use codificação base64, execute as seguintes etapas:
- Crie uma classe proxy com base em um URL de invocação do AEM Forms.
- Crie um projeto Microsoft Visual Studio .NET que produz o assembly do cliente .NET.
Criação de uma classe proxy
Você pode criar uma classe proxy usada para criar o assembly do cliente .NET usando uma ferramenta que acompanha o Microsoft Visual Studio. O nome da ferramenta é wsdl.exe e está localizado na pasta de instalação do Microsoft Visual Studio. Para criar uma classe proxy, abra o prompt de comando e navegue até a pasta que contém o arquivo wsdl.exe. Para obter mais informações sobre a ferramenta wsdl.exe, consulte o Ajuda do MSDN.
Digite o seguinte comando no prompt de comando:
wsdl https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Por padrão, essa ferramenta cria um arquivo CS na mesma pasta que se baseia no nome do WSDL. Nessa situação, ele cria um arquivo CS chamado EncryptDocumentService.cs. Use esse arquivo CS para criar um objeto proxy que permita chamar o serviço especificado no URL de invocação.
Alterar o URL na classe de proxy para incluir ?blob=base64
para assegurar que BLOB
retorna dados binários. Na classe proxy, localize a seguinte linha de código:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";
e alterá-lo para:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
O Chamada de AEM Forms usando codificação Base64 usos da seção MyApplication/EncryptDocument
como exemplo. Se estiver criando um assembly de cliente .NET para outro serviço Forms, certifique-se de substituir MyApplication/EncryptDocument
com o nome do serviço.
Desenvolvendo o assembly do cliente .NET
Crie um projeto do Visual Studio Class Library que produz um assembly de cliente .NET. O arquivo CS criado usando wsdl.exe pode ser importado para este projeto. Este projeto produz um arquivo DLL (o assembly do cliente .NET) que você pode usar em outros projetos do Visual Studio .NET para invocar um serviço.
- Inicie o Microsoft Visual Studio .NET.
- Crie um projeto da Biblioteca de classes e o nomeie como DocumentService.
- Importe o arquivo CS criado usando wsdl.exe.
- No Projeto selecione Adicionar referência.
- Na caixa de diálogo Adicionar referência, selecione System.Web.Services.dll.
- Clique em Selecionar e, em seguida, clique em OK.
- Compile e crie o projeto.
MyApplication/EncryptDocument
serviço.?blob=base64
ao URL na classe proxy usada para criar o assembly do cliente .NET. Caso contrário, não será possível recuperar dados binários da variável BLOB
objeto.Fazendo referência ao assembly do cliente .NET
Coloque o conjunto de clientes .NET recém-criado no computador onde está desenvolvendo o aplicativo cliente. Depois de colocar o assembly do cliente .NET em um diretório, você pode referenciá-lo a partir de um projeto. Consulte também a System.Web.Services
biblioteca do seu projeto. Se não fizer referência a esta biblioteca, não poderá utilizar a assemblagem de cliente .NET para invocar um serviço.
- No Projeto selecione Adicionar referência.
- Clique no botão .NET guia .
- Clique em Procurar e localize o arquivo DocumentService.dll.
- Clique em Selecionar e, em seguida, clique em OK.
Chamando um serviço usando um assembly de cliente .NET que usa codificação Base64
Você pode invocar o MyApplication/EncryptDocument
serviço (que foi criado no Workbench) usando um assembly de cliente .NET que usa codificação Base64. Para invocar o MyApplication/EncryptDocument
execute as seguintes etapas:
- Crie um assembly de cliente Microsoft .NET que consuma o
MyApplication/EncryptDocument
WSDL de serviço. - Crie um projeto cliente do Microsoft .NET. Faça referência ao assembly do cliente Microsoft .NET no projeto do cliente. Referência também
System.Web.Services
. - Usando o assembly do cliente Microsoft .NET, crie um
MyApplication_EncryptDocumentService
chamando seu construtor padrão. - Defina as
MyApplication_EncryptDocumentService
do objetoCredentials
com umaSystem.Net.NetworkCredential
objeto. NoSystem.Net.NetworkCredential
, especifique um nome de usuário dos formulários AEM e a senha correspondente. Defina valores de autenticação para permitir que o aplicativo cliente .NET troque mensagens SOAP com AEM Forms com êxito. - Crie um
BLOB
usando seu construtor. OBLOB
é usado para armazenar um documento do PDF paraMyApplication/EncryptDocument
processo. - Crie um
System.IO.FileStream
chamando seu construtor. Passe um valor de string que representa o local do arquivo do documento PDF e o modo no qual o arquivo deve ser aberto. - Crie uma matriz de bytes que armazene o conteúdo da variável
System.IO.FileStream
objeto. Você pode determinar o tamanho da matriz de bytes obtendo a variávelSystem.IO.FileStream
do objetoLength
propriedade. - Preencha a matriz de bytes com dados de fluxo chamando a variável
System.IO.FileStream
do objetoRead
método . Passe a matriz de bytes, a posição inicial e o comprimento do fluxo para ler. - Preencha o
BLOB
ao atribuir seubinaryData
com o conteúdo da matriz de bytes. - Chame o
MyApplication/EncryptDocument
processo chamando oMyApplication_EncryptDocumentService
do objetoinvoke
e a aprovação doBLOB
objeto que contém o documento PDF. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. - Crie um
System.IO.FileStream
chamando seu construtor e passando um valor de string que representa o local do arquivo do documento criptografado por senha. - Crie uma matriz de bytes que armazene o conteúdo de dados do
BLOB
objeto retornado peloMyApplicationEncryptDocumentService
do objetoinvoke
método . Preencha a matriz de bytes obtendo o valor da variávelBLOB
do objetobinaryData
membro de dados. - Crie um
System.IO.BinaryWriter
chamando seu construtor e passando oSystem.IO.FileStream
objeto. - Escreva o conteúdo da matriz de bytes em um arquivo PDF chamando o
System.IO.BinaryWriter
do objetoWrite
e transmitindo a matriz de bytes.
Chamada de serviço usando classes proxy Java e codificação Base64 invoking-a-service-using-java-proxy-classes-and-base64-encoding
Você pode chamar um serviço da AEM Forms usando classes proxy Java e Base64. Para invocar o MyApplication/EncryptDocument
serviço usando classes proxy Java, execute as seguintes etapas:
-
Crie classes proxy Java usando JAX-WS que consome a variável
MyApplication/EncryptDocument
WSDL de serviço. Use o seguinte ponto de extremidade WSDL:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
note note NOTE Substituir hiro-xp
* com o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. * -
Compacte as classes proxy Java criadas usando JAX-WS em um arquivo JAR.
-
Inclua o arquivo JAR do proxy Java e os arquivos JAR localizados no seguinte caminho:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
no caminho da classe do seu projeto do cliente Java.
-
Crie um
MyApplicationEncryptDocumentService
usando seu construtor. -
Crie um
MyApplicationEncryptDocument
chamando oMyApplicationEncryptDocumentService
do objetogetEncryptDocument
método . -
Defina os valores de conexão necessários para chamar o AEM Forms atribuindo valores aos seguintes membros de dados:
-
Atribua o ponto de extremidade WSDL e o tipo de codificação ao
javax.xml.ws.BindingProvider
do objetoENDPOINT_ADDRESS_PROPERTY
campo. Para invocar oMyApplication/EncryptDocument
usando a codificação Base64, especifique o seguinte valor de URL:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64
-
Atribua o usuário de formulários AEM ao
javax.xml.ws.BindingProvider
do objetoUSERNAME_PROPERTY
campo. -
Atribua o valor da senha correspondente ao
javax.xml.ws.BindingProvider
do objetoPASSWORD_PROPERTY
campo.
O exemplo de código a seguir mostra essa lógica do aplicativo:
code language-as3 //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);
-
-
Recupere o documento do PDF para enviar ao
MyApplication/EncryptDocument
criar umjava.io.FileInputStream
usando seu construtor. Passe um valor de string que especifica o local do documento PDF. -
Crie uma matriz de bytes e preencha-a com o conteúdo da variável
java.io.FileInputStream
objeto. -
Crie um
BLOB
usando seu construtor. -
Preencha o
BLOB
ao invocar seusetBinaryData
e transmitindo a matriz de bytes. OBLOB
do objetosetBinaryData
é o método a ser chamado ao usar a codificação Base64. Consulte Fornecimento de objetos BLOB em solicitações de serviço. -
Chame o
MyApplication/EncryptDocument
processo chamando oMyApplicationEncryptDocument
do objetoinvoke
método . Passe oBLOB
objeto que contém o documento PDF. O método invoke retorna umBLOB
objeto que contém o documento PDF criptografado. -
Crie uma matriz de bytes que contenha o documento PDF criptografado chamando o
BLOB
do objetogetBinaryData
método . -
Salve o documento PDF criptografado como um arquivo PDF. Grave a matriz de bytes em um arquivo.
Consulte também
Início rápido: Chamada de serviço usando arquivos proxy Java e codificação Base64
Criando um assembly de cliente .NET que usa codificação Base64
Chamar o AEM Forms usando MTOM invoking-aem-forms-using-mtom
Você pode chamar os serviços da AEM Forms usando o MTOM padrão do serviço da Web. Esse padrão define como os dados binários, como um documento PDF, são transmitidos pela Internet ou pela intranet. Um recurso do MTOM é o uso do XOP:Include
elemento. Esse elemento é definido na especificação XML Binary Otimized Packaging (XOP) para fazer referência aos anexos binários de uma mensagem SOAP.
A discussão aqui é sobre o uso do MTOM para invocar o seguinte processo de curta duração do AEM Forms chamado MyApplication/EncryptDocument
.
MyApplication/EncryptDocument
usando o Workbench. (Consulte Uso do Workbench.)Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento PDF não seguro passado para o processo. Essa ação se baseia na variável
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo nomeadainDoc
. - Criptografa o documento PDF com uma senha. Essa ação se baseia na variável
PasswordEncryptPDF
operação. O documento PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
OutOfMemory
* exceção.*A discussão aqui é sobre o uso do MTOM em um projeto do Microsoft .NET para chamar os serviços do AEM Forms. O .NET Framework usado é 3.5, e o ambiente de desenvolvimento é Visual Studio 2008. Se você tiver o WSE (Web Service Enhancements, Melhorias de serviço da Web) instalado no computador de desenvolvimento, remova-o. O .NET 3.5 Framework suporta uma estrutura SOAP chamada Windows Communication Foundation (WCF). Ao invocar o AEM Forms usando o MTOM, somente o WCF (não WSE) é compatível.
Criando um projeto .NET que chame um serviço usando MTOM creating-a-net-project-that-invokes-a-service-using-mtom
Você pode criar um projeto do Microsoft .NET que possa chamar um serviço do AEM Forms usando serviços da Web. Primeiro, crie um projeto Microsoft .NET usando o Visual Studio 2008. Para chamar um serviço do AEM Forms, crie uma Referência de serviço para o serviço do AEM Forms que você deseja chamar em seu projeto. Ao criar uma Referência de serviço, especifique um URL para o serviço AEM Forms:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Substituir localhost
com o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. Substituir MyApplication/EncryptDocument
com o nome do serviço AEM Forms a ser chamado. Por exemplo, para invocar uma operação de Rights Management, especifique:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
O lc_version
garante que a funcionalidade do AEM Forms, como MTOM, esteja disponível. Sem especificar o lc_version
não é possível chamar o AEM Forms usando o MTOM.
Após criar uma Referência de serviço, os tipos de dados associados ao serviço do AEM Forms estarão disponíveis para uso em seu projeto .NET. Para criar um projeto .NET que chame um serviço AEM Forms, execute as seguintes etapas:
-
Crie um projeto .NET usando o Microsoft Visual Studio 2008.
-
No Projeto selecione Adicionar referência de serviço.
-
No Endereço , especifique o WSDL para o serviço AEM Forms. Por exemplo,
code language-as3 http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
-
Clique em Ir e, em seguida, clique em OK.
Chamar um serviço usando MTOM em um projeto .NET invoking-a-service-using-mtom-in-a-net-project
Considere a MyApplication/EncryptDocument
processo que aceita um documento PDF não seguro e retorna um documento PDF criptografado por senha. Para invocar o MyApplication/EncryptDocument
processo (que foi criado no Workbench) usando o MTOM, execute as seguintes etapas:
-
Crie um projeto do Microsoft .NET.
-
Crie um
MyApplication_EncryptDocumentClient
usando seu construtor padrão. -
Crie um
MyApplication_EncryptDocumentClient.Endpoint.Address
usando oSystem.ServiceModel.EndpointAddress
construtor. Passe um valor de string que especifica o WSDL para o serviço AEM Forms e o tipo de codificação:code language-as3 https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
Não é necessário usar a variável
lc_version
atributo. Esse atributo é usado ao criar uma referência de serviço. No entanto, certifique-se de especificar?blob=mtom
.note note NOTE Substituir hiro-xp
* com o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. * -
Crie um
System.ServiceModel.BasicHttpBinding
obtendo o valor da variávelEncryptDocumentClient.Endpoint.Binding
membro de dados. Converta o valor de retorno paraBasicHttpBinding
. -
Defina as
System.ServiceModel.BasicHttpBinding
do objetoMessageEncoding
membro de dados paraWSMessageEncoding.Mtom
. Esse valor garante que o MTOM seja usado. -
Ative a autenticação HTTP básica executando as seguintes tarefas:
- Atribuir o nome de usuário dos formulários AEM ao membro de dados
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
. - Atribua o valor da senha correspondente ao membro de dados
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password
. - Atribuir o valor constante
HttpClientCredentialType.Basic
ao membro de dadosBasicHttpBindingSecurity.Transport.ClientCredentialType
. - Atribuir o valor constante
BasicHttpSecurityMode.TransportCredentialOnly
ao membro de dadosBasicHttpBindingSecurity.Security.Mode
.
O código de exemplo a seguir mostra essas tarefas.
code language-as3 //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;
- Atribuir o nome de usuário dos formulários AEM ao membro de dados
-
Crie um
BLOB
usando seu construtor. OBLOB
é usado para armazenar um documento PDF para passar para oMyApplication/EncryptDocument
processo. -
Crie um
System.IO.FileStream
chamando seu construtor. Passe um valor de string que representa o local do arquivo do documento PDF e o modo no qual o arquivo deve ser aberto. -
Crie uma matriz de bytes que armazene o conteúdo da variável
System.IO.FileStream
objeto. Você pode determinar o tamanho da matriz de bytes obtendo a variávelSystem.IO.FileStream
do objetoLength
propriedade. -
Preencha a matriz de bytes com dados de fluxo chamando a variável
System.IO.FileStream
do objetoRead
método . Passe a matriz de bytes, a posição inicial e o comprimento do fluxo para ler. -
Preencha o
BLOB
ao atribuir seuMTOM
membro de dados com o conteúdo da matriz de bytes. -
Chame o
MyApplication/EncryptDocument
processo chamando oMyApplication_EncryptDocumentClient
do objetoinvoke
método . Passe oBLOB
objeto que contém o documento PDF. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. -
Crie um
System.IO.FileStream
chamando seu construtor e passando um valor de string que representa o local do arquivo do documento de PDF seguro. -
Crie uma matriz de bytes que armazene o conteúdo de dados do
BLOB
objeto retornado peloinvoke
método . Preencha a matriz de bytes obtendo o valor da variávelBLOB
do objetoMTOM
membro de dados. -
Crie um
System.IO.BinaryWriter
chamando seu construtor e passando oSystem.IO.FileStream
objeto. -
Escreva o conteúdo da matriz de bytes em um arquivo PDF chamando o
System.IO.BinaryWriter
do objetoWrite
e transmitindo a matriz de bytes.
Consulte também
Início rápido: Chamar um serviço usando MTOM em um projeto .NET
Acesso a vários serviços usando serviços da Web
Criação de um aplicativo Web ASP.NET que invoque um processo de vida longa centrado em humanos
Chamar o AEM Forms usando SwaRef invoking-aem-forms-using-swaref
Você pode chamar os serviços da AEM Forms usando SwaRef. O conteúdo da wsi:swaRef
O elemento XML é enviado como um anexo dentro de um corpo SOAP que armazena a referência ao anexo. Ao chamar um serviço Forms usando SwaRef, crie classes proxy Java usando a API Java para XML Web Services (JAX-WS). (Consulte API Java para serviços XML da Web.)
A discussão aqui é sobre invocar o seguinte processo de curta duração do Forms chamado MyApplication/EncryptDocument
ao utilizar SwaRef.
MyApplication/EncryptDocument
usando o Workbench. (Consulte Uso do Workbench.)Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento PDF não seguro passado para o processo. Essa ação se baseia na variável
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo nomeadainDoc
. - Criptografa o documento PDF com uma senha. Essa ação se baseia na variável
PasswordEncryptPDF
operação. O documento PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
A discussão abaixo é sobre como invocar os serviços da Forms usando SwaRef em um aplicativo cliente Java. O aplicativo Java usa classes proxy criadas usando JAX-WS.
Chamar um serviço usando arquivos da biblioteca JAX-WS que usam SwaRef invoke-a-service-using-jax-ws-library-files-that-use-swaref
Para invocar o MyApplication/EncryptDocument
processar usando arquivos proxy Java criados com JAX-WS e SwaRef, execute as seguintes etapas:
-
Crie classes proxy Java usando JAX-WS que consome a variável
MyApplication/EncryptDocument
WSDL de serviço. Use o seguinte ponto de extremidade WSDL:code language-as3 https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Para obter mais informações, consulte Criando classes proxy Java usando JAX-WS.
note note NOTE Substituir hiro-xp
* com o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. * -
Compacte as classes proxy Java criadas usando JAX-WS em um arquivo JAR.
-
Inclua o arquivo JAR do proxy Java e os arquivos JAR localizados no seguinte caminho:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
no caminho da classe do seu projeto do cliente Java.
-
Crie um
MyApplicationEncryptDocumentService
usando seu construtor. -
Crie um
MyApplicationEncryptDocument
chamando oMyApplicationEncryptDocumentService
do objetogetEncryptDocument
método . -
Defina os valores de conexão necessários para chamar o AEM Forms atribuindo valores aos seguintes membros de dados:
-
Atribua o ponto de extremidade WSDL e o tipo de codificação ao
javax.xml.ws.BindingProvider
do objetoENDPOINT_ADDRESS_PROPERTY
campo. Para invocar oMyApplication/EncryptDocument
usando a codificação SwaRef, especifique o seguinte valor de URL:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref
-
Atribua o usuário de formulários AEM ao
javax.xml.ws.BindingProvider
do objetoUSERNAME_PROPERTY
campo. -
Atribua o valor da senha correspondente ao
javax.xml.ws.BindingProvider
do objetoPASSWORD_PROPERTY
campo.
O exemplo de código a seguir mostra essa lógica do aplicativo:
code language-as3 //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);
-
-
Recupere o documento do PDF para enviar ao
MyApplication/EncryptDocument
criar umjava.io.File
usando seu construtor. Passe um valor de string que especifica o local do documento PDF. -
Crie um
javax.activation.DataSource
usando oFileDataSource
construtor. Passe ojava.io.File
objeto. -
Crie um
javax.activation.DataHandler
usando seu construtor e passando ojavax.activation.DataSource
objeto. -
Crie um
BLOB
usando seu construtor. -
Preencha o
BLOB
ao invocar seusetSwaRef
e a aprovação dojavax.activation.DataHandler
objeto. -
Chame o
MyApplication/EncryptDocument
processo chamando oMyApplicationEncryptDocument
do objetoinvoke
e a aprovação doBLOB
objeto que contém o documento PDF. O método invoke retorna umBLOB
objeto que contém um documento PDF criptografado. -
Preencha um
javax.activation.DataHandler
chamando oBLOB
do objetogetSwaRef
método . -
Converta o
javax.activation.DataHandler
para umjava.io.InputSteam
chamando ajavax.activation.DataHandler
do objetogetInputStream
método . -
Escreva o
java.io.InputSteam
para um arquivo PDF que representa o documento PDF criptografado.
Consulte também
Início rápido: Chamar um serviço usando SwaRef em um projeto Java
Chamada de AEM Forms usando dados BLOB sobre HTTP invoking-aem-forms-using-blob-data-over-http
Você pode chamar os serviços da AEM Forms usando serviços da Web e transmitir dados BLOB via HTTP. Passar dados BLOB por HTTP é uma técnica alternativa em vez de usar codificação base64, DIME ou MIME. Por exemplo, você pode passar dados via HTTP em um projeto do Microsoft .NET que usa o Aprimoramento do serviço da Web 3.0, que não é compatível com DIME ou MIME. Ao usar dados BLOB em HTTP, os dados de entrada são carregados antes que o serviço AEM Forms seja chamado.
"Chamar o AEM Forms usando dados BLOB sobre HTTP" discute chamar o seguinte processo de curta duração do AEM Forms chamado MyApplication/EncryptDocument
transmitindo dados BLOB por HTTP.
MyApplication/EncryptDocument
usando o Workbench. (Consulte Uso do Workbench.)Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento PDF não seguro passado para o processo. Essa ação se baseia na variável
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo nomeadainDoc
. - Criptografa o documento PDF com uma senha. Essa ação se baseia na variável
PasswordEncryptPDF
operação. O documento PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
Criando um assembly de cliente .NET que usa dados em HTTP creating-a-net-client-assembly-that-uses-data-over-http
Para criar um assembly de cliente que use dados via HTTP, siga o processo especificado em Chamada de AEM Forms usando codificação Base64. No entanto, altere o URL na classe de proxy para incluir ?blob=http
em vez de ?blob=base64
. Essa ação garante que os dados sejam transmitidos por HTTP. Na classe proxy, localize a seguinte linha de código:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument";
e alterá-lo para:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument?blob=http";
Fazendo referência ao assembly .NET clienMyApplication/EncryptDocumentt
Coloque o novo assembly do cliente .NET no computador em que você está desenvolvendo seu aplicativo cliente. Depois de colocar o assembly do cliente .NET em um diretório, você pode referenciá-lo a partir de um projeto. Faça referência ao System.Web.Services
biblioteca do seu projeto. Se não fizer referência a esta biblioteca, não poderá utilizar a assemblagem de cliente .NET para invocar um serviço.
- No Projeto selecione Adicionar referência.
- Clique no botão .NET guia .
- Clique em Procurar e localize o arquivo DocumentService.dll.
- Clique em Selecionar e, em seguida, clique em OK.
Chamando um serviço usando um assembly de cliente .NET que usa dados BLOB via HTTP
Você pode invocar o MyApplication/EncryptDocument
serviço (que foi criado no Workbench) usando um assembly de cliente .NET que usa dados via HTTP. Para invocar o MyApplication/EncryptDocument
execute as seguintes etapas:
- Crie o assembly do cliente .NET.
- Faça referência ao assembly do cliente Microsoft .NET. Crie um projeto cliente do Microsoft .NET. Faça referência ao assembly do cliente Microsoft .NET no projeto do cliente. Referência também
System.Web.Services
. - Usando o assembly do cliente Microsoft .NET, crie um
MyApplication_EncryptDocumentService
chamando seu construtor padrão. - Defina as
MyApplication_EncryptDocumentService
do objetoCredentials
com umaSystem.Net.NetworkCredential
objeto. NoSystem.Net.NetworkCredential
, especifique um nome de usuário dos formulários AEM e a senha correspondente. Defina valores de autenticação para permitir que o aplicativo cliente .NET troque mensagens SOAP com AEM Forms com êxito. - Crie um
BLOB
usando seu construtor. OBLOB
é usado para transmitir dados para a variávelMyApplication/EncryptDocument
processo. - Atribua um valor de string à variável
BLOB
do objetoremoteURL
membro de dados que especifica o local do URI de um documento PDF para passar para aMyApplication/EncryptDocument
serviço. - Chame o
MyApplication/EncryptDocument
processo chamando oMyApplication_EncryptDocumentService
do objetoinvoke
e a aprovação doBLOB
objeto. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. - Crie um
System.UriBuilder
usando seu construtor e transmitindo o valor do objeto retornadoBLOB
do objetoremoteURL
membro de dados. - Converta o
System.UriBuilder
para umSystem.IO.Stream
objeto. (O C# Quick Start que segue esta lista ilustra como executar esta tarefa.) - Crie uma matriz de bytes e preencha-a com os dados localizados na
System.IO.Stream
objeto. - Crie um
System.IO.BinaryWriter
chamando seu construtor e passando oSystem.IO.FileStream
objeto. - Escreva o conteúdo da matriz de bytes em um arquivo PDF chamando o
System.IO.BinaryWriter
do objetoWrite
e transmitindo a matriz de bytes.
Chamada de serviço usando classes proxy Java e dados BLOB por HTTP invoking-a-service-using-java-proxy-classes-and-blob-data-over-http
Você pode chamar um serviço da AEM Forms usando classes proxy Java e dados BLOB via HTTP. Para invocar o MyApplication/EncryptDocument
serviço usando classes proxy Java, execute as seguintes etapas:
-
Crie classes proxy Java usando JAX-WS que consome a variável
MyApplication/EncryptDocument
WSDL de serviço. Use o seguinte ponto de extremidade WSDL:code language-as3 https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
Para obter mais informações, consulte Criando classes proxy Java usando JAX-WS.
note note NOTE Substituir hiro-xp
* com o endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. * -
Compacte as classes proxy Java criadas usando JAX-WS em um arquivo JAR.
-
Inclua o arquivo JAR do proxy Java e os arquivos JAR localizados no seguinte caminho:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
no caminho da classe do seu projeto do cliente Java.
-
Crie um
MyApplicationEncryptDocumentService
usando seu construtor. -
Crie um
MyApplicationEncryptDocument
chamando oMyApplicationEncryptDocumentService
do objetogetEncryptDocument
método . -
Defina os valores de conexão necessários para chamar o AEM Forms atribuindo valores aos seguintes membros de dados:
-
Atribua o ponto de extremidade WSDL e o tipo de codificação ao
javax.xml.ws.BindingProvider
do objetoENDPOINT_ADDRESS_PROPERTY
campo. Para invocar oMyApplication/EncryptDocument
usando BLOB sobre codificação HTTP, especifique o seguinte valor de URL:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http
-
Atribua o usuário de formulários AEM ao
javax.xml.ws.BindingProvider
do objetoUSERNAME_PROPERTY
campo. -
Atribua o valor da senha correspondente ao
javax.xml.ws.BindingProvider
do objetoPASSWORD_PROPERTY
campo.
O exemplo de código a seguir mostra essa lógica do aplicativo:
code language-as3 //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);
-
-
Crie um
BLOB
usando seu construtor. -
Preencha o
BLOB
ao invocar seusetRemoteURL
método . Passe um valor de string que especifica a localização do URI de um documento PDF para passar para aMyApplication/EncryptDocument
serviço. -
Chame o
MyApplication/EncryptDocument
processo chamando oMyApplicationEncryptDocument
do objetoinvoke
e a aprovação doBLOB
objeto que contém o documento PDF. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. -
Crie uma matriz de bytes para armazenar o fluxo de dados que representa o documento PDF criptografado. Chame o
BLOB
do objetogetRemoteURL
(use oBLOB
objeto retornado peloinvoke
método ). -
Crie um
java.io.File
usando seu construtor. Este objeto representa o documento PDF criptografado. -
Crie um
java.io.FileOutputStream
usando seu construtor e passando ojava.io.File
objeto. -
Chame o
java.io.FileOutputStream
do objetowrite
método . Passe a matriz de bytes que contém o fluxo de dados que representa o documento PDF criptografado.
Chamar o AEM Forms usando DIME invoking-aem-forms-using-dime
Você pode chamar os serviços da AEM Forms usando SOAP com anexos. O AEM Forms oferece suporte aos padrões de serviço da Web MIME e DIME. O DIME permite enviar anexos binários, como documentos PDF, juntamente com solicitações de invocação em vez de codificar o anexo. O Chamar o AEM Forms usando DIME seção discute invocar o seguinte processo de curta duração do AEM Forms chamado MyApplication/EncryptDocument
utilizando DIME.
Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento PDF não seguro passado para o processo. Essa ação se baseia na variável
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo nomeadainDoc
. - Criptografa o documento PDF com uma senha. Essa ação se baseia na variável
PasswordEncryptPDF
operação. O documento PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
Esse processo não se baseia em um processo AEM Forms existente. Para seguir junto com os exemplos de código, crie um processo chamado MyApplication/EncryptDocument
**usando o Workbench. (Consulte Uso do Workbench.)
Criando um projeto .NET que usa DIME creating-a-net-project-that-uses-dime
Para criar um projeto .NET que possa invocar um serviço Forms usando DIME, execute as seguintes tarefas:
- Instale os Aprimoramentos de serviços da Web 2.0 em seu computador de desenvolvimento.
- A partir do seu projeto .NET, crie uma referência da Web para o serviço Forms do FormsAEM.
Instalação dos aprimoramentos de serviços da Web 2.0
Instale os Aprimoramentos de Serviços Web 2.0 em seu computador de desenvolvimento e integre-o ao Microsoft Visual Studio .NET. Você pode baixar os Aprimoramentos de serviços da Web 2.0 da seção Centro de download da Microsoft.
Nesta página da Web, procure por Aprimoramentos de serviços da Web 2.0 e baixe-os no computador de desenvolvimento. Este download coloca um arquivo chamado Microsoft WSE 2.0 SPI.msi em seu computador. Execute o programa de instalação e siga as instruções online.
Criação de uma referência da Web para um serviço AEM Forms
Depois de instalar os Aprimoramentos de Serviços Web 2.0 no computador de desenvolvimento e criar um projeto Microsoft .NET, crie uma referência Web para o serviço Forms. Por exemplo, para criar uma referência da Web para a variável MyApplication/EncryptDocument
e supondo que o Forms esteja instalado no computador local, especifique o seguinte URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL
Após criar uma referência da Web, os dois tipos de dados proxy a seguir estão disponíveis para você usar em seu projeto .NET: EncryptDocumentService
e EncryptDocumentServiceWse
. Para invocar o MyApplication/EncryptDocument
processar usando o DIME, use o EncryptDocumentServiceWse
tipo .
Referência à biblioteca WSE
- No menu Projeto , selecione Adicionar referência.
- Na caixa de diálogo Adicionar referência, selecione Microsoft.Web.Services2.dll.
- Selecione System.Web.Services.dll.
- Clique em Selecionar e em OK.
Criar uma referência da Web para um serviço Forms
- No menu Projeto , selecione Adicionar referência à Web.
- Na caixa de diálogo URL, especifique o URL para o serviço Forms.
- Clique em Ir e em Adicionar referência.
Chamando um serviço usando DIME em um projeto .NET
Você pode chamar um serviço Forms usando DIME. Considere a MyApplication/EncryptDocument
processo que aceita um documento PDF não seguro e retorna um documento PDF criptografado por senha. Para invocar o MyApplication/EncryptDocument
para processar usando o DIME, execute as seguintes etapas:
-
Crie um projeto Microsoft .NET que permita que você chame um serviço Forms usando DIME. Certifique-se de incluir os Aprimoramentos de serviços da Web 2.0 e criar uma referência da Web para o serviço AEM Forms.
-
Depois de definir uma referência da Web para a variável
MyApplication/EncryptDocument
processar, criar umEncryptDocumentServiceWse
usando seu construtor padrão. -
Defina as
EncryptDocumentServiceWse
do objetoCredentials
membro de dados com umSystem.Net.NetworkCredential
que especifica o nome de usuário e o valor de senha dos formulários AEM. -
Crie um
Microsoft.Web.Services2.Dime.DimeAttachment
usando seu construtor e transmitindo os seguintes valores:- Um valor de string que especifica um valor de GUID. Você pode obter um valor de GUID chamando a variável
System.Guid.NewGuid.ToString
método . - Um valor de string que especifica o tipo de conteúdo. Como esse processo requer um documento PDF, especifique
application/pdf
. - A
TypeFormat
valor de enumeração. EspecifiqueTypeFormat.MediaType
. - Um valor de string que especifica o local do documento PDF a ser transmitido ao processo AEM Forms.
- Um valor de string que especifica um valor de GUID. Você pode obter um valor de GUID chamando a variável
-
Crie um
BLOB
usando seu construtor. -
Adicione o anexo DIME à
BLOB
atribuindo oMicrosoft.Web.Services2.Dime.DimeAttachment
do objetoId
valor do membro de dados paraBLOB
do objetoattachmentID
membro de dados. -
Chame o
EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add
e passe oMicrosoft.Web.Services2.Dime.DimeAttachment
objeto. -
Chame o
MyApplication/EncryptDocument
processo chamando oEncryptDocumentServiceWse
do objetoinvoke
e a aprovação doBLOB
objeto que contém o anexo DIME. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. -
Obtenha o valor do identificador de anexo obtendo o valor do retornado
BLOB
do objetoattachmentID
membro de dados. -
Iterar através dos anexos localizados em
EncryptDocumentServiceWse.ResponseSoapContext.Attachments
e use o valor do identificador de anexo para obter o documento PDF criptografado. -
Obter um
System.IO.Stream
obtendo o valor da variávelAttachment
do objetoStream
membro de dados. -
Crie uma matriz de bytes e passe essa matriz de bytes para a
System.IO.Stream
do objetoRead
método . Esse método preenche a matriz de bytes com um fluxo de dados que representa o documento PDF criptografado. -
Crie um
System.IO.FileStream
chamando seu construtor e passando um valor de string que representa um local de arquivo PDF. Este objeto representa o documento PDF criptografado. -
Crie um
System.IO.BinaryWriter
chamando seu construtor e passando oSystem.IO.FileStream
objeto. -
Escreva o conteúdo da matriz de bytes no arquivo PDF chamando o
System.IO.BinaryWriter
do objetoWrite
e transmitindo a matriz de bytes.
Criando classes proxy Java do Apache Axis que usam DIME creating-apache-axis-java-proxy-classes-that-use-dime
Você pode usar a ferramenta Apache Axis WSDL2Java para converter um WSDL de serviço em classes proxy Java para que possa chamar operações de serviço. Usando o Apache Ant, você pode gerar arquivos de biblioteca do Axis a partir de um WSDL de serviço da AEM Forms que permite chamar o serviço. (Consulte Criação de classes proxy Java usando o Apache Axis.)
A ferramenta Apache Axis WSDL2Java gera arquivos JAVA que contêm métodos usados para enviar solicitações SOAP a um serviço. As solicitações SOAP recebidas por um serviço são decodificadas pelas bibliotecas geradas pelo Axis e transformadas em métodos e argumentos.
Para invocar o MyApplication/EncryptDocument
serviço (que foi criado no Workbench) usando arquivos de biblioteca gerados pelo Axis e DIME, execute as seguintes etapas:
-
Crie classes proxy Java que consomem o
MyApplication/EncryptDocument
serviço WSDL usando o Apache Axis. (Consulte Criação de classes proxy Java usando o Apache Axis.) -
Inclua as classes proxy Java no caminho da classe.
-
Crie um
MyApplicationEncryptDocumentServiceLocator
usando seu construtor. -
Crie um
URL
usando seu construtor e passando um valor de string que especifica a definição de WSDL do serviço AEM Forms. Certifique-se de especificar?blob=dime
no final do URL do ponto de extremidade SOAP. Por exemplo, usecode language-as3 https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
-
Crie um
EncryptDocumentSoapBindingStub
chamando seu construtor e passando oMyApplicationEncryptDocumentServiceLocator
e oURL
objeto. -
Defina o nome de usuário e o valor da senha dos formulários de AEM chamando a função
EncryptDocumentSoapBindingStub
do objetosetUsername
esetPassword
métodos.code language-as3 encryptionClientStub.setUsername("administrator"); encryptionClientStub.setPassword("password");
-
Recupere o documento do PDF para enviar ao
MyApplication/EncryptDocument
criando umjava.io.File
objeto. Passe um valor de string que especifica o local do documento PDF. -
Crie um
javax.activation.DataHandler
usando seu construtor e transmitindo umjavax.activation.FileDataSource
objeto. Ojavax.activation.FileDataSource
pode ser criado usando seu construtor e transmitindo ojava.io.File
objeto que representa o documento PDF. -
Crie um
org.apache.axis.attachments.AttachmentPart
usando seu construtor e passando ojavax.activation.DataHandler
objeto. -
Anexe o anexo chamando o
EncryptDocumentSoapBindingStub
do objetoaddAttachment
e a aprovação doorg.apache.axis.attachments.AttachmentPart
objeto. -
Crie um
BLOB
usando seu construtor. Preencha oBLOB
objeto com o valor do identificador de anexo chamando oBLOB
do objetosetAttachmentID
e transmitindo o valor do identificador de anexo. Esse valor pode ser obtido chamando a funçãoorg.apache.axis.attachments.AttachmentPart
do objetogetContentId
método . -
Chame o
MyApplication/EncryptDocument
processo chamando oEncryptDocumentSoapBindingStub
do objetoinvoke
método . Passe oBLOB
objeto que contém o anexo DIME. Esse processo retorna um documento PDF criptografado em umBLOB
objeto. -
Obtenha o valor do identificador de anexo chamando o valor retornado
BLOB
do objetogetAttachmentID
método . Esse método retorna um valor de string que representa o valor identificador do anexo retornado. -
Recupere os anexos chamando o
EncryptDocumentSoapBindingStub
do objetogetAttachments
método . Esse método retorna uma matriz deObjects
que representam os anexos. -
Iterar através dos anexos (a
Object
array) e use o valor identificador de anexo para obter o documento PDF criptografado. Cada elemento é umorg.apache.axis.attachments.AttachmentPart
objeto. -
Obtenha o
javax.activation.DataHandler
objeto associado ao anexo chamando oorg.apache.axis.attachments.AttachmentPart
do objetogetDataHandler
método . -
Obter um
java.io.FileStream
chamando ojavax.activation.DataHandler
do objetogetInputStream
método . -
Crie uma matriz de bytes e passe essa matriz de bytes para a
java.io.FileStream
do objetoread
método . Esse método preenche a matriz de bytes com um fluxo de dados que representa o documento PDF criptografado. -
Crie um
java.io.File
usando seu construtor. Este objeto representa o documento PDF criptografado. -
Crie um
java.io.FileOutputStream
usando seu construtor e passando ojava.io.File
objeto. -
Chame o
java.io.FileOutputStream
do objetowrite
e transmita a matriz de bytes que contém o fluxo de dados que representa o documento PDF criptografado.
Consulte também
Início rápido: Chamar um serviço usando DIME em um projeto Java
Usar autenticação baseada em SAML using-saml-based-authentication
O AEM Forms oferece suporte a vários modos de autenticação de serviço da Web ao chamar serviços. Um modo de autenticação está especificando um nome de usuário e um valor de senha usando um cabeçalho de autorização básico na chamada de serviço da Web. O AEM Forms também oferece suporte à autenticação baseada em asserção SAML. Quando um aplicativo cliente chama um serviço da AEM Forms usando um serviço da Web, o aplicativo cliente pode fornecer informações de autenticação de uma das seguintes maneiras:
- Transmissão de credenciais como parte da autorização básica
- Enviar token de nome de usuário como parte do cabeçalho WS-Security
- Enviar uma asserção SAML como parte do cabeçalho WS-Security
- Enviar token Kerberos como parte do cabeçalho WS-Security
A AEM Forms não oferece suporte à autenticação baseada em certificado padrão, mas oferece suporte à autenticação baseada em certificado em um formulário diferente.
A identidade dos usuários dos formulários de AEM pode ser representada por meio de uma asserção SAML assinada usando uma chave secreta. O código XML a seguir mostra um exemplo de uma asserção 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>
Esta asserção de exemplo é emitida para um usuário administrador. Essa asserção contém os seguintes itens observáveis:
- É válido por um determinado período.
- É emitido para um usuário específico.
- Ele é assinado digitalmente. Então qualquer modificação feita quebraria a assinatura.
- Ele pode ser apresentado ao AEM Forms como um token da identidade do usuário semelhante ao nome de usuário e senha.
Um aplicativo cliente pode recuperar a asserção de qualquer API do AEM Forms AuthenticationManager que retorne um AuthResult
objeto. Você pode obter um AuthResult
executando um dos dois métodos a seguir:
- Autenticar o usuário usando qualquer um dos métodos de autenticação expostos pela API do AuthenticationManager. Normalmente, você usaria o nome de usuário e a senha; no entanto, também é possível usar a autenticação de certificado.
- Usar o
AuthenticationManager.getAuthResultOnBehalfOfUser
método . Esse método permite que um aplicativo cliente obtenha umAuthResult
para qualquer usuário do AEM forms.
um usuário do AEM forms pode ser autenticado usando um token SAML obtido. Essa asserção SAML (fragmento xml) pode ser enviada como parte do cabeçalho WS-Security com a chamada de serviço da Web para autenticação de usuário. Normalmente, um aplicativo cliente autentica um usuário, mas não armazenou as credenciais do usuário. (Ou o usuário fez logon nesse cliente por meio de um mecanismo diferente do uso de um nome de usuário e senha.) Nessa situação, o aplicativo cliente deve chamar o AEM Forms e representar um usuário específico que tenha permissão para invocar o AEM Forms.
Para representar um usuário específico, chame o AuthenticationManager.getAuthResultOnBehalfOfUser
usando um serviço da Web. Esse método retorna um AuthResult
instância que contém a asserção SAML para esse usuário.
Em seguida, use essa asserção SAML para invocar qualquer serviço que exija autenticação. Essa ação envolve enviar a asserção como parte do cabeçalho SOAP. Quando uma chamada de serviço da Web é feita com essa asserção, o AEM Forms identifica o usuário como aquele representado por essa asserção. Ou seja, o usuário especificado na asserção é o usuário que está chamando o serviço.
Uso de classes do Apache Axis e autenticação baseada em SAML using-apache-axis-classes-and-saml-based-authentication
Você pode chamar um serviço AEM Forms por classes proxy Java que foram criadas usando a biblioteca Eixo. (Consulte Criação de classes proxy Java usando o Apache Axis.)
Ao usar o AXIS que usa a autenticação baseada em SAML, registre o manipulador de solicitação e resposta no Axis. O Apache Axis chama o manipulador antes de enviar uma solicitação de invocação para o AEM Forms. Para registrar um manipulador, crie uma classe Java que se estende org.apache.axis.handlers.BasicHandler
.
Criar um AssertionHandler com Eixo
A seguinte classe Java, chamada de AssertionHandler.java
, mostra um exemplo de uma classe Java que se estende org.apache.axis.handlers.BasicHandler
.
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);
}
}
}
Registre o manipulador
Para registrar um manipulador no Axis, crie um arquivo client-config.wsdd . Por padrão, o Axis procura um arquivo com esse nome. O código XML a seguir é um exemplo de um arquivo client-config.wsdd . Consulte a documentação do Eixo para obter mais informações.
<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>
Chamar um serviço AEM Forms
O exemplo de código a seguir chama um serviço AEM Forms usando a autenticação baseada em SAML.
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());
}
}
Usando um assembly de cliente .NET e autenticação baseada em SAML using-a-net-client-assembly-and-saml-based-authentication
Você pode invocar um serviço Forms usando um assembly de cliente .NET e autenticação baseada em SAML. Para fazer isso, você deve usar o WSE (Web Service Aprimorments 3.0). Para obter informações sobre como criar um assembly de cliente .NET que usa WSE, consulte Criando um projeto .NET que usa DIME.
A arquitetura WSE usa tipos de dados Políticas, Asserções e SecurityToken. Resumidamente, para uma chamada de serviço da Web, especifique uma política. Uma política pode ter várias asserções. Cada asserção pode conter filtros. Um filtro é chamado em determinados estágios em uma chamada de serviço da Web e, nesse momento, pode modificar a solicitação SOAP. Para obter detalhes completos, consulte a documentação Melhorias do serviço da Web 3.0 .
Criar a asserção e o filtro
O exemplo de código C# a seguir cria classes de filtro e asserção. Este exemplo de código cria um SamlAssertionOutputFilter. Esse filtro é chamado pela estrutura WSE antes da solicitação SOAP ser enviada para o AEM Forms.
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);
}
}
Criar o token SAML
Crie uma classe para representar a asserção SAML. A principal tarefa executada por essa classe é converter valores de dados da string em xml e preservar o espaço em branco. Esse xml de asserção é importado posteriormente para a solicitação 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);
}
. . .
}
Chamar um serviço AEM Forms
O exemplo de código C# a seguir chama um serviço Forms usando a autenticação baseada em SAML.
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);
}
}
Considerações relacionadas ao usar serviços da Web related-considerations-when-using-web-services
Às vezes, ocorrem problemas ao invocar determinadas operações dos serviços da AEM Forms usando serviços da Web. O objetivo desta discussão é identificar essas questões e fornecer uma solução, se disponível.
Chamada de operações de serviço de forma assíncrona invoking-service-operations-asynchronously
Se você tentar invocar de forma assíncrona uma operação de serviço do AEM Forms, como a variável Gerar PDF htmlToPDF
operação, uma SoapFaultException
ocorre. Para resolver esse problema, crie um arquivo XML de vínculo personalizado que mapeie a variável ExportPDF_Result
elemento e outros elementos em classes diferentes. O XML a seguir representa um arquivo de vínculo personalizado.
<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>
Use esse arquivo XML ao criar arquivos proxy Java usando JAX-WS. (Consulte Criando classes proxy Java usando JAX-WS.)
Faça referência a esse arquivo XML ao executar a ferramenta JAX-WS (wsimport.exe) usando o - b
opção de linha de comando. Atualize o wsdlLocation
no arquivo XML de vínculo para especificar o URL do AEM Forms.
Para garantir que a invocação assíncrona funcione, modifique o valor do URL do ponto final e especifique async=true
. Por exemplo, para arquivos proxy Java criados com JAX-WS, especifique o seguinte para o BindingProvider.ENDPOINT_ADDRESS_PROPERTY
.
https://server:port/soap/services/ServiceName?wsdl&async=true&lc_version=9.0.0
A lista a seguir especifica outros serviços que precisam de um arquivo de vínculo personalizado quando invocados de forma assíncrona:
- PDFG3D
- Gerenciador de tarefas
- Gerenciador de aplicativos
- Gerenciador de diretórios
- Distiller
- Rights Management
- Gerenciamento de documentos
Diferenças nos servidores de aplicativos J2EE differences-in-j2ee-application-servers
Às vezes, uma biblioteca de proxy criada usando um servidor de aplicativos J2EE específico não chama com êxito o AEM Forms que está hospedado em um servidor de aplicativos J2EE diferente. Considere uma biblioteca de proxy que é gerada usando o AEM Forms que é implantada no WebSphere. Esta biblioteca de proxy não pode invocar com êxito os serviços da AEM Forms implantados no Servidor de Aplicativos JBoss.
Alguns tipos de dados complexos do AEM Forms, como PrincipalReference
, são definidas de forma diferente quando o AEM Forms é implantado no WebSphere, em comparação com o JBoss Application Server. As diferenças nos JDKs usados pelos diferentes serviços de aplicativos do J2EE são o motivo das diferenças nas definições de WSDL. Como resultado, use bibliotecas de proxy geradas no mesmo servidor de aplicativos J2EE.
Acesso a vários serviços usando serviços da Web accessing-multiple-services-using-web-services
Devido a conflitos de namespace, objetos de dados não podem ser compartilhados entre vários WSDLs de serviço. Diferentes serviços podem compartilhar tipos de dados e, portanto, os serviços compartilham a definição desses tipos nas WSDLs. Por exemplo, não é possível adicionar dois assemblies cliente .NET que contêm um BLOB
tipo de dados para o mesmo projeto de cliente .NET. Se você tentar fazer isso, ocorrerá um erro de compilação.
A lista a seguir especifica os tipos de dados que não podem ser compartilhados entre vários WSDLs de serviço:
User
Principals
PrincipalReference
Groups
Roles
BLOB
Para evitar esse problema, é recomendável qualificar totalmente os tipos de dados. Por exemplo, considere um aplicativo .NET que faça referência ao serviço Forms e ao serviço de assinatura usando uma referência de serviço. Ambas as referências de serviço conterão um BLOB
classe . Para usar um BLOB
, qualifique totalmente a variável BLOB
ao declará-lo. Essa abordagem é mostrada no seguinte exemplo de código. Para obter informações sobre este exemplo de código, consulte Assinatura digital - Forms interativo.
O exemplo de código C# a seguir assina um formulário interativo renderizado pelo serviço Forms. O aplicativo cliente tem duas referências de serviço. O BLOB
A instância associada ao serviço do Forms pertence ao SignInteractiveForm.ServiceReference2
namespace. Da mesma forma, a variável BLOB
A instância associada ao serviço de assinatura pertence ao SignInteractiveForm.ServiceReference1
namespace. O formulário interativo assinado é salvo como um arquivo PDF chamado LoanXFASigned.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);
}
}
}
}
Os serviços que começam com a letra I produzem arquivos proxy inválidos services-starting-with-the-letter-i-produce-invalid-proxy-files
O nome de algumas classes proxy geradas pelo AEM Forms está incorreto ao usar o Microsoft .Net 3.5 e o WCF. Esse problema ocorre quando classes proxy são criadas para IBMFilenetContentRepositoryConnector, IDPSchedulerService ou qualquer outro serviço cujo nome começa com a letra I. Por exemplo, o nome do cliente gerado no caso de IBMFileNetContentRepositoryConnector é BMFileNetContentRepositoryConnectorClient
. A letra I está ausente na classe de proxy gerada.