Java,  OSB

Expondo um Serviço Rest no OSB – Usando nXSD

Aqui vou explicar como podemos fazer a exposição no OSB usando o processo nativo, onde utilizamos o componente nXSD para esta finalidade do próprio OSB na versão 12C.

Lembrando que você pode expor o serviço REST usando também um JAVA Callout como mostrei em Posts anteriores ou simplesmente fazendo desta forma sem utilizar qualquer lib, desde que seja na versão 12C pois a versão 11 não possui este componente. Também mostrarei abaixo como você poderia usar o componente Routing Options

Caso você não tenha visto como criar uma API pode fazer utilizando o Post abaixo, pois iremos expor esta API que criamos, que é um simples HelloWorld feito em Java utilizando o framework Spring Boot

Abra o JDeveloper, clique em File >> New e clique em From Gallery conforme abaixo

Agora na caixa aberta na caixa de pesquisa escreva service bus e ao lado direito escolha a opção Service Bus Application with Service Bus Project (Applications) conforme abaixo:

Na tela abaixo em Application Name escreva ServiceBusApplication e clique em Next

Agora em Project Name escreva OSBProject e clique em Finish

Sera criado então o projeto conforme abaixo:

Em cima do projeto OSBProject clique com o cotão direito, depois clique em New >> From Gallery conforme abaixo

Na caixa de pesquisa escreva em folder e ao lado direito clique em Folder (General) e clique em OK

Em Folder Name escreva Business e clique em OK conforme abaixo:

Então ficará conforme abaixo:

Repita o mesmo procedimento de criação de pastas até que tenhamos as seguintes pastas: Business, libs, Proxy e WSDL

Agora em cima da pasta WSDL novamente clique até From Gallery conforme mostrado acima e na caixa de pesquisa escreva File e ao lado direito procure File (General) conforme abaixo e clique em OK

Na tela abaixo em File Name escreva Pessoa.wsdl e clique em OK

Na tela abaixo dê um duplo clique sobre o arquivo criado Pessoa.wsdl e coloque o conteúdo abaixo:

<wsdl:types>
    <xsd:schema targetNamespace="http://xmlns.oracle.com/UansBlogApplication/Pessoa/"
                elementFormDefault="unqualified">


        <xsd:element name="obterMensagemRequest">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="nome" type="xsd:string"  minOccurs="1" maxOccurs="1"/>                       
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

        <xsd:element name="obterMensagemResponse">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="mensagem" type="xsd:string"  minOccurs="1" maxOccurs="1"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

    </xsd:schema>
</wsdl:types>

<wsdl:message name="obterMensagemRequest">
    <wsdl:part name="parameters" element="tns:obterMensagemRequest"/>
</wsdl:message>
<wsdl:message name="obterMensagemResponse">
    <wsdl:part name="parameters" element="tns:obterMensagemResponse"/>
</wsdl:message>

<wsdl:portType name="PessoaPortType">   
    <wsdl:operation name="obterMensagem">
        <wsdl:input message="tns:obterMensagemRequest"/>
        <wsdl:output message="tns:obterMensagemResponse"/>
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="PessoaBinding" type="tns:PessoaPortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="obterMensagem">
        <soap:operation style="document" soapAction="obterMensagem"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>

</wsdl:binding>

<wsdl:service name="Pessoa">
    <wsdl:port name="PessoaSoapPort" binding="tns:PessoaBinding">
        <soap:address location="http://example.uanscarvalho.com.br/PessoaPS"/>
    </wsdl:port>
</wsdl:service>

Ficará conforme abaixo:

Agora em cima da pasta Business clique com o botão direito e escolha a opção Business Service

Na tela abaixo em Service Name clique em PessoaBS e em Transport selecione a opção http e clique em Next

Na próxima tela cliquem na opção Messaging e em Request e Response escolha a opção Text para que fique conforme abaixo e em seguida clique em Next, pois para o OSB ele entenderá que enviaremos um Texto e receberemos um Texto de nossa aplicação REST

Na proxima tela em EndPoint URI coloque a URL que definimos no nosso serviço REST conforme o Passo 1

Veja abaixo como devera ficar nosso Business

Agora clique na aba Transport do Business e certifique-se de que esta a sua URL definida no Passo 1 desta sequencia de posts.

Clique na pasta Proxy e em seguida, em New e clique em Proxy Service.. conforme abaixo

Em Service Name escreva PessoaPS, em WSDL selecione o WSDL que criamos escolhendo apção (Port) e deixe marcado a opção Generate Pipeline apenas com o nome PessoaPS também pois ele irá criar um pipeline em seguida e depois clique em Next.

Em seguida pode deixar como esta o Endpoint URI e clique em Finish

Veja que os dois artefatos foram criados

O atributo alt desta imagem está vazio. O nome do arquivo é image-70.png

Agora abra o PessoaPS.pipeline e quando abrir clique sobre ele com o botão direito >> Insert Into >> PipelinePairNode

Agora após o Stage1 arraste o componente Service Callout conforme abaixo:

Agora clique em Service Callout e abaixo, em Service clique na lupa para abrir uma telinha e em seguida clique no Business PessoaBS então em seguida clique em OK conforme abaixo:

Abaixo vamos criar as variáveis que serão do nosso payload de Request e para nosso payload de Response:

Coloque então o valor pessoaRequest para o payload de Request e pessoaResponse para o payload de Response conforme abaixo:

Agora, abaixo de Request Action, Arraste agora um Insert e em Value coloque a URI que será o nome do seu “Path” mapeado do Microserviço, e os demais dados conforme abaixo.

Abaixo os valores:

  • Value: <http:relative-uri>/hello</http:relative-uri>
  • Position: as las child of
  • Location: outbound
  • ./ctx:transport/ctx:request

Arraste mais um Insert colocando os valores abaixo que corresponde ao encoding que deve ser no nosso caso UTF-8

Abaixo os valores:

  • Value: <tran:encoding xmlns:tran=”http://www.bea.com/wli/sb/transports”>utf-8</tran:encoding>
  • Position: as las child of
  • Location: outbound
  • ./ctx:transport/ctx:request

Arraste mais um Insert e aqui você deverá colocar se o seu método é um POST ou GET ou o que for o nosso Microserviço, que no nosso caso será um POST.

Agora finalmente arrastaremos um Transport Header, veja acima que nos inserts que realizamos foi apenas para “preencher nosso oubound” que deverá ser levado junto ao nosso Header do serviço em outbound Request e abaixo em Actions devemos colocar as informações que devem ser transportadas no Header, que no nosso caso é um application/json mas poderíamos ter um token, um key… Abaixo desta figura vou colocar um exemplo:

Exemplo do que poderíamos estar transportando no Header:

Obs: Para o nosso Projeto não precisa fazer o passo abaixo… este é apenas um Exemplo.

Mais um exemplo:

Ate qui o nosso processo já esta quase pronto mas vou colocar mais um componente no processo chamado Routing Options apenas para você entender para que serve pois pode ser muito útil, mas novamente para este nosso exemplo ele não é necessário.

Obs: Não precisa colocar este componente no nosso processo, ele é apenas um exemplo… Mas poderíamos ter um Routing Options que serve apenas para trocar o nosso endpoint que setamos no business (PessoaBS.biz)

Veja que o Business está como http://localhost:9000 e usando o componente Routing Options estamos alterando essa URL (URI) para http://localhost:7001 conforme imagem acima.

Obs: Este componente pode ser usado em diversas hipóteses, por exemplo uma troca de endpoint do ambiente de homologação para um de produção definindo um IF antes da entrada.

Vamos voltar agora ao nosso processo:

Dentro de nosso Service Callout definimos o que precisávamos, vamos agora criar um nXSD que sera o componente responsável por fazer a transformação do formato XML para JSON para passar este payload à nossa API.

Clique então sobre o projeto OSBProject e crie uma pasta chamada XSD para que fique conforme a estrutura abaixo:

Sobre a pasta XSD clique com o botão direito e navegue até NXSD Schema… para criarmos o arquivo:

Na tela abaixo que se abrirá clique em Next

Abaixo em File Name: coloque o nome requestServico.xsd e clique em Next

Abaixo selecione a opção JSON Interchange Format e clique em Next

Abaixo coloque os seguintes valores para a tela que irá abrir conforme abaixo e posteriormente clique em Next

  • File name: “pode deixar em branco, não precisa colocar nada”
  • Target namespace: “fica a seu critério colocar o que quiser, no meu caso deixei a default”
  • Root element: obterMensagemRequest ( aqui você deverá colocar o nome que esta no elemento de request da operação que estamos nos referindo que esta no seu WSDL )
  • Character set: US-ASCII (este é o default mas podemos colocar o UTF-8 por exemplo)
  • Sample: “Aqui você deverá colocar um exemplo de payload completo do seu request com todos os elementos, no meu caso tem apenas “nome” mas se tivesse mais você deverá colocar todos”

Exemplo no WSDL do que devemos colocar no Root element acima:

Na tela abaixo você verá que ele irá criar um schema das informações que passamos, então apenas clique em Next

Clique agora em Finish

Agora vamos criar o nXSD de Response do serviço:

Volte na pasta XSD que criamos anteriormente e faça o mesmo procedimento para criação do arquivo conforme abaixo:

O atributo alt desta imagem está vazio. O nome do arquivo é image-8.png

Na tela abaixo que se abrirá clique em Next

Abaixo em File Name: coloque o nome responseServico.xsd e clique em Next

Abaixo selecione a opção JSON Interchange Format e clique em Next

Abaixo coloque os seguintes valores para a tela que irá abrir conforme abaixo e posteriormente clique em Next

  • File name: “pode deixar em branco, não precisa colocar nada”
  • Target namespace: “fica a seu critério colocar o que quiser, no meu caso deixei a default”
  • Root element: obterMensagemResponse ( aqui você deverá colocar o nome que esta no elemento de response da operação que estamos nos referindo que esta no seu WSDL )
  • Character set: US-ASCII (este é o default)
  • Sample: “Aqui você deverá colocar um exemplo de payload completo do seu response com todos os elementos, no meu caso tem apenas “mensagem” mas se tivesse mais você deverá colocar todos”

Na tela abaixo você verá que ele irá criar um schema das informações que passamos, então apenas clique em Next

Clique agora em Finish

Vamos agora voltar ao nosso Stage1 para definirmos nosso processo de request para chamada do serviço e depois iremos para o outro Stage1 ao lado para definirmos nosso processo de Response para a resposta do serviço.

Dentro do Stage1 arraste um Assign e em Variable mais abaixo dê o nome de requestXML conforme abaixo:

Acima clique em <Expression> e monte o seu payload de request que no meu caso é o payload abaixo:

<pes:obterMensagemRequest>
     <nome>{data($body/pes:obterMensagemRequest/nome)}</nome>
</pes:obterMensagemRequest>

Ficará conforme abaixo:

Agora abaixo do Assign arraste o componente nXSD:

  • Translate: XML to Native (Aqui estamos dizendo que estamos passando o processo XML para o processo Json que é o nativo da nossa API)
  • Input: $requestXML (este é o nome da variavel que colocamos no assign acima, pois sera o nosso input de entrada)
  • nXSD Schema: Static (selecione esta opção e clique na lupa e vá até a opção que esta o xsd que criamos que é o requestServico.xsd e clique na operacao obterMensagemRequest)
  • Output: Variable (selecione esta opção e coloque o valor da variavel que colocamos no request do nosso serviceCallout que definimos acima que no nosso caso é pessoaRequest)

Veja abaixo como ficará:

Abaixo vou colocar um assign mas que será opcional no nosso caso pois muitas vezes podem ocorrer erros com caracteres especiais na hora de enviar o request para o serviço, neste caso podemos usar a função fn-bea:binary-to-text

Em Value coloque:

fn-bea:binary-to-text($pessoaRequest, "UTF-8")

Aqui estamos so repetindo o valor da variavel pessoaRequest que já esta no nosso serviceCallout que é a variável responsável por enviar nosso request para a API.

Agora abaixo de Response Pipeline arraste mais um nXSD Translate e coloque os parâmetros conforme abaixo:

  • Translate: Native to XML (Aqui invertemos o processo de request, pois agora estamos dizendo que estamos recebendo um Json(nativo) e passando para um XML )
  • Input: $pessoaResponse (este é o nome da variável que colocamos no assign acima, pois sera o nosso input de entrada, ou seja a resposta do serviço)
  • nXSD Schema: Static (selecione esta opção e clique na lupa e vá até a opção que esta o xsd que criamos que é o responseServico.xsd e clique na operacao obterMensagemResponse)
  • Output: Variable (selecione esta opção e coloque o valor responseXML, pois usaremos essa variavel para enriquecer nosso Response do serviço)

Veja abaixo como ficou:

Arraste agora um Replace para que fique abaixo do nXSD Translate com o seguinte paylaod de Response:

<pes:obterMensagemResponse>
    <mensagem>{data($responseXML)}</mensagem>
</pes:obterMensagemResponse>

Obs: Veja que a variável responseXML que usamos acima será usada para preencher nosso payload.

Teremos então o seguinte fluxo:

Faça deploy de todos os artefatos e chame então este Proxy PessoaPS no SbConsole e teremos o seguinte resultado:

Caso queira, pode fazer o download no meu GitHub deste Projeto.

https://github.com/uanscarvalho/ProxyRestWhithNXSD

Abraços e até a Próxima

/:-D

Criei este Blog destinado a desenvolvedores e interessados na Tecnologia Oracle SOA Suite, minha idéia é que no futuro ele sirva de referência para Analistas e Desenvolvedores desde aprendizes a especialistas. Já existem alguns Posts interessantes que abordam um pouco do meu dia a dia, no passar do tempo irei alimentar este Blog com o máximo de informações possíveis, por isso peço por gentileza aos interessados e afins que caso tenham alguma dúvida, sugestão ou crítica que me digam para que eu possa da melhor forma suprir as expectativas e na medida do possível sanar todas as duvidas que vierem a surgir ou até mesmo criar novos Posts abordando algum tópico que venha a ser relevante para todos os interessados. Obrigado Uans Carvalho

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *