domingo, 16 de julho de 2017

CRUD com Oracle Rest Data Service - ORDS

Neste post vou mostrar como instalar e gerar um CRUD com o ORDS. Irei rodar em modo standalone.

Instalação:


Certifique que possua instalado o OracleXE e tenha o SQL Developer.

Passos:

1-) Baixe o ORDS em link. (No momento deste post a ultima versão disponível é a 3.0.11)

2-) Descompacte o arquivo zip


3-) Abra um terminal e execute o comando:

java -jar ords.war

Siga as instruções.
No caso deste exemplo escolhi para pular a etapa:
"Caso esteja usando o Oracle Application Express ou migrando de mod_plsql" escolhendo 2.


Obs: No caso do exemplo, um erro ocorreu ao executar o JETTY por conta que a porta 8080 está em uso.

4-) Alterando a porta default 8080
Abra o arquivo "<DIR_CONF>/ords/standalone/standalone.properties" e altere a propriedade "jetty.port".


Rode o comando abaixo novamente e o ORDS estará rodando.

java -jar ords.war




Criação do schema e tabela para o teste:


1-) Execute os seguintes comando com o usuário "SYS":

CREATE USER ordsschema IDENTIFIED BY ords;
GRANT "CONNECT" TO ordsschema;
GRANT "RESOURCE" TO ordsschema;
GRANT UNLIMITED TABLESPACE TO ordsschema;

2-) Logue o schema gerado e execute os seguintes comandos:

CREATE TABLE CONTACT (
  CONTACTID NUMBER(5,0), 
  FIRSTNAME VARCHAR2(20 BYTE),
  LASTNAME VARCHAR2(20 BYTE), 
  EMAIL VARCHAR2(50 BYTE),  
  CONSTRAINT CONTACT_PK PRIMARY KEY (CONTACTID)
  );

insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (1,'Leonardo','Sugahara','leonardosugahara@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (2,'Christy','Reeve','Christy.Reeve@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (3,'Vashti','Legge','Vashti.Legge@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (4,'Carla','Norman','Carla.Norman@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (5,'Karla','Hooper','Karla.Hooper@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (6,'Tracy','Holman','Tracy.Holman@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (7,'Marinda','Connolly','Marinda.Connolly@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (8,'Clementine','Almond','Clementine.Almond@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (9,'Kiley','Wells','Kiley.Wells@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (10,'Tamika','Harper','Tamika.Harper@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (11,'Syreeta','Mcmahon','Syreeta.Mcmahon@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (12,'Delinda','Dunkley','Delinda.Dunkley@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (13,'Shellie','Coles','Shellie.Coles@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (14,'Shemeka','Hirst','Shemeka.Hirst@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (15,'Gerri','Kerr','Gerri.Kerr@mydomain.com');
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values (16,'Rory','Muir','Rory.Muir@mydomain.com');

Gerando o CRUD da tabela "CONTACT":


1-) No SQL Developer, clique com o botão direito na sua conexão "ordsschema", vá em "Serviço Rest" -> "Ativar Serviço Rest"


2-) Deixe as configurações conforme a seguir:


3-) Clique em "Próximo" depois em finalizar.



4-) Vá em "Exibir" -> "Serviços de Dados Rest" e selecione "Desenvolvimento"


5-) Vamos criar um user com a role "SQL Developer" para poder executar o serviço. Execute o comando abaixo no dir de instalação do ORDS:

java -jar ords.war user ordsDeveloper "SQL Developer"


6-) Voltando ao SQL Developer, vamos criar uma conexão na view que abrimos, clique em "conexão", no sina de "+" e depois preencha conforme a imagem:



7-) Com a conexão estabelecida, clique com o botão direito em "Módulos" e depois em "Novo Modulo".


Preencha os campos conforme imagem e clique em "Próximo":


8-) Em "Padrão URI" preencha com "contact/" e clique em "Próximo":

9-) Neste primeiro item vamos gerar o método "GET", deixe as opções como estão clique em "Próximo" e na tela seguinte "Finalizar".



10-) Com o módulo gerado, navegue até "GET" e inclua a query abaixo na "Planilha SQL":

SELECT
    contact.contactid,
    contact.firstname,
    contact.lastname,
    contact.email
FROM
    contact
WHERE 
    contact.contactid = NVL(:contactid,contact.contactid)



11-) Vamos criar o método "POST", clique com o botão direito em "contact/", vá em "Adicionar Handler" -> "POST".
Clique no sinal de "+" em "Tipos de MIME" e preencha com "application/json".



12-) Inclua o SQL abaixo na "Planilha SQL":

begin
insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values ((select max(CONTACTID) + 1 from contact),:firstname,:lastname,:email);
commit;
end;

13-)  Para o método "PUT", faça os mesmos procedimentos do passa anterior escolhendo o "Handler" "PUT", e acrescente o SQL abaixo:

begin
    if :contactid is null then
        insert into contact (CONTACTID,FIRSTNAME,LASTNAME,EMAIL) values ((select max(CONTACTID) + 1 from contact),:firstname,:lastname,:email);
    else 
        update contact set FIRSTNAME = firstname, LASTNAME = :lastname, EMAIL = :email where  CONTACTID = :contactid;
    end if;
commit;
end;

13-) Para o método "DELETE", faça os mesmos procedimentos do passa anterior escolhendo o "Handler" "DELETE", e acrescente o SQL abaixo:

begin
    delete from CONTACT where CONTACTID = :id;
    commit;
end;

14-) Com os métodos gerados, vamos fazer o upload do módulo. Clique com o botão direito em cima do módulo "mymodule" e selecione "Upload"


15-) Testes:

http://localhost:8081/ords/ordsschema/mymodule/contact/
GET:

GET de um único elemento:

http://localhost:8081/ords/ordsschema/mymodule/contact/?contactid=5


POST:


PUT:


DELETE:



quinta-feira, 6 de julho de 2017

Building soa projects with Maven

Vou mostrar neste post como gerar um "sar" do projeto SOA via Maven. Irei demonstrar como criar o pom.xml e compilar via JDeveloper e via linha de comando.

Passos:

1-) Vamos instalar o "Oracle Maven Synchronization Plug-In".
Execute os comandos abaixo:

. $ORACLE_HOME/wlserver/server/bin/setWLSEnv.sh
cd $ORACLE_HOME/oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1
mvn install:install-file -DpomFile=oracle-maven-sync-12.2.1.pom -Dfile=oracle-maven-sync-12.2.1.jar
mvn com.oracle.maven:oracle-maven-sync:push -DoracleHome=$ORACLE_HOME


2-) Vamos atualizar o catálogo archetype, execute o comando abaixo:

mvn archetype:crawl -Dcatalog=$HOME/.m2/archetype-catalog.xml

3-) Baixe a lib do wagon-http neste link, e copie a lib em '$ORACLE_HOME/oracle_common/modules/org.apache.maven_3.2.5/lib/ext'.

Obs: estou usando o maven que vem na instalação do SOA Suite, caso esteja usando o outra versão copie para '$MAVEN_HOME/lib/ext'

4-) Configure o server no arquivo settings.xml (preencha em username e password com seu user da OTN):

<server>
    <id>maven.oracle.com</id>
    <username>OTN_USERNAME</username>
    <password>OTN_PASSWORD</password>
    <configuration>
      <basicAuthScope>
        <host>ANY</host>
        <port>ANY</port>
        <realm>OAM 11g</realm>
      </basicAuthScope>
      <httpConfiguration>
        <all>
          <params>
            <property>
              <name>http.protocol.allow-circular-redirects</name>
              <value>%b,true</value>
            </property>
          </params>
        </all>
      </httpConfiguration>
    </configuration>
  </server>


5-) Agora vamos gerar o arquivo pom.xml, com o cursor em cima do seu projeto SOA, clique com o botão direito, selecione "New" -> "Maven POM for project".



6-) Certifique que em "Packaging" está com a opção "sar". Clique em "OK".


7-) Clique em "Repositories" no arquivo pom.xml e preencha os campos conforme descritivo abaixo:

ID: maven.oracle.com
URL: https://maven.oracle.com
Repositories: true
Plugin Repositories: true


8-) Vamos gerar o composite via JDeveloper, clique com o botão direito no arquivo pom.xml, vá em "Run Maven" -> "package"


 9-) Vamos gerar o composite via linha de comando, execute o comando abaixo:

mvn package


Referencias: Configuring the Oracle Maven Repository
Installing and Configuring Maven for Build Automation and Dependency Management

sábado, 17 de junho de 2017

BPEL Property inMemoryOptimization

Existem algumas propriedades no BPEL no qual podemos setar para diminuir a quantidade de I/O no metadados de infra do SOA Suite e execução em memoria, que em alguns casos ajuda na performance do ambiente.

Vou demonstrar como configurar o atributo "inMemoryOptimization" tanto na versão 12c (12.2.1) e na versão 11g (11.1.1.7).

Este atributo deve ser utilizado com processos que sejam transient e que não contenha as atividades de dehydration com receive, wait, onMessage e onAlarm.

No caso farei com que seja persistido o fluxo do BPEL somente se tiver falha.

SOA Suite 12c:

Passos:

1-)  Quando selecionar para criar um BPEL, selecione a Aba "In Memory SOA" e selecione "falted" para "Completion Persist Policy"


Quando o BPEL for criado, verá na aba properties a configuração que selecionamos:




2-) Execute seu fluxo e verá que para os fluxos de sucesso o trace não está disponível e para os fluxos com erro o trace irá aparecer.

Fluxo sucesso:
Fluxo erro:


SOA Suite 11g:

1-) No JDeveloper do 11g não temos a aba igual a aba "In Memory SOA", devemos fazer a configuração das propriedades manualmente. Abra o composite, click na aba "source" e acrescente as propriedades abaixo no BPEL ou selecione e o BPEL e acrescente as propriedades via "Porperty Inspector".






O resultado dos testes é o mesmo que fiz no 12c.

Referencias:
Documentação SOA Suite 11g - link
Documentação SOA Suite 12c - link

sábado, 27 de maio de 2017

Oracle JET – primeiro CRUD


Neste post irei demonstrar como criar um CRUD utilizando Rest e o Oracle JET.

Instalações e configurações necessárias para o Oracle JET:


Passos:

1-) Instalando o npm:
sudo apt-get install npm

2-) Atualizar o nodejs:
sudo npm cache clean -f
sudo npm install -g n
sudo n stable




3-) Setup necessário para o OracleJET
sudo npm -g install yo grunt-cli
sudo npm -g install generator-oraclejet


4-) Criar a estrutura do projeto:
yo oraclejet MyRestTest --template=basic

5-) Executando o projeto
cd MyRestTest
grunt build
grunt serve





Referencia: OracleJET – Get Started

Com o template gerado, peguei como referencia o html e o JavaScript do cookbook para gerar a minha pagina.

O exemplo utiliza conteúdo estático para o preenchimento da tabela, eu gerei um serviço Rest, para o CRUD de um contato. Com isso no JavaScript, acrescentei a referencia para a biblioteca 'ojs/ojmodel'.
Caso queira saber como gerar um serviço Rest, fica o link do post que fiz utilizando o Spring Boot e o IntelliJ.

ContactController:

package br.com.sugahara.myrestproject.controller;

import br.com.sugahara.MyRestProject.controller.response.Contact;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by leonardo on 20/05/17.
 */
@RestController
@RequestMapping("/contact")
public class ContactController {

    private List<Contact> listContact;

    public ContactController(){
        this.listContact = new ArrayList<Contact>();
        listContact.add(new Contact(1, "Nethba","Dadon","+5511999999999"));
        listContact.add(new Contact(2, "Sigly","Mitda","+5511888888888"));
        listContact.add(new Contact(3, "Maar","Herema","+5511888888888"));
        listContact.add(new Contact(4, "Rethelm","Phereal","+5511888888888"));

    }

    @CrossOrigin(origins = "http://localhost:8000")
    @GetMapping("/contacts")
    public List<Contact> getContacts(@RequestParam(required=false) Integer contactId){

        return listContact;
    }

    @CrossOrigin(origins = "http://localhost:8000")
    @PostMapping("/contacts")
    public Contact postContacts(@RequestBody(required=true) Contact contact){
        contact.setContactId(listContact.size()+1);
        listContact.add(contact);
        return contact;
    }

    @CrossOrigin(origins = "http://localhost:8000")
    @PutMapping("/contacts/{contactId}")
    public Contact putContacts(@PathVariable("contactId") Integer contactId,@RequestBody(required=true) Contact contact){
        contact.setContactId(contactId);
        for(Contact c : listContact ){
            if(c.getContactId() == contact.getContactId()){
                //c = contact;
                c.setFirstName(contact.getFirstName());
                c.setLastName(contact.getLastName());
                c.setCellphone(contact.getCellphone());
                break;
            }
        }

        return contact;
    }

    @CrossOrigin(origins = "http://localhost:8000")
    @DeleteMapping("/contacts/{contactId}")
    public Integer deleteContacts(@PathVariable("contactId") Integer contactId){

        for(Contact c : listContact ){
            if(c.getContactId() == contactId){
                listContact.remove(c);
                break;
            }
        }

        return contactId;
    }
}
 

Contact:

package br.com.sugahara.myrestproject.controller.response;

import java.io.Serializable;

/**
 * Created by leonardo on 22/05/17.
 */
public class Contact implements Serializable {

    private Integer contactId;
    private String firstName;
    private String lastName;
    private String cellphone;

    public Contact() {
    }

    public Contact(Integer contactId, String firstName, String lastName, String cellphone) {
        this.contactId = contactId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.cellphone = cellphone;
    }

    public Integer getContactId() {
        return contactId;
    }

    public void setContactId(Integer contactId) {
        this.contactId = contactId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCellphone() {
        return cellphone;
    }

    public void setCellphone(String cellphone) {
        this.cellphone = cellphone;
    }
}
 

Criando a pagina


1-) Crie os diretórios "views" e "viewModels" na seguinte estrutura:


2-) Em views, crie o arquivo contact.html, com o seguinte conteúdo:

<div id="tableDemo" class="oj-flex oj-flex-items-pad">
    <div class="oj-xl-8 oj-lg-8 oj-md-6 oj-flex-item">
        <table id="table" summary="Contact List" aria-label="Contacts Table"
               data-bind="
                          ojComponent: {component: 'ojTable',
                                    beforeCurrentRow: currentRowListener,
                                    data: datasource,
                                    columnsDefault: {sortable: 'none'},
                                    columns: [{headerText: 'Contact Id',
                                               field: 'contactId'},
                                              {headerText: 'First Name',
                                               field: 'firstName'},
                                              {headerText: 'Last Name',
                                               field: 'lastName'},
                                              {headerText: 'Cellphone',
                                               field: 'cellphone'}]}">
        </table>
    </div>
    <div class="oj-xl-4 oj-lg-4 oj-md-6 oj-flex-item">
        <div class="oj-flex oj-flex-items-pad">
            <div class="oj-flex-item deprecated-col-default-width">
                <label for="spinnercontrol">Contact Id</label>
            </div>
            <div class="oj-flex-item deprecated-col-default-width">
                <input id="contactIdInput"
                       data-bind="ojComponent: {
                       component: 'ojInputNumber',
                       max: 2000, min: 0, step: 1, value: inputContactId}"/>
            </div>
        </div>
        <div class="oj-flex oj-flex-items-pad">
            <div class="oj-flex-item deprecated-col-default-width">
                <label for="inputcontrol">First Name</label>
            </div>
            <div class="oj-flex-item deprecated-col-default-width">
                <input id="firstNameInput"
                       data-bind="ojComponent: {
                       component: 'ojInputText',
                       value: inputFirstName}"/>
            </div>
        </div>
        <div class="oj-flex oj-flex-items-pad">
            <div class="oj-flex-item deprecated-col-default-width">
                <label for="spinnercontrol">Last Name</label>
            </div>
            <div class="oj-flex-item deprecated-col-default-width">
                <input id="lastNameInput"
                       data-bind="ojComponent: {
                       component: 'ojInputText',
                       value: inputLastName}"/>
            </div>
        </div>
        <div class="oj-flex oj-flex-items-pad">
            <div class="oj-flex-item deprecated-col-default-width">
                <label for="spinnercontrol">Cellphone</label>
            </div>
            <div class="oj-flex-item deprecated-col-default-width">
                <input id="cellphoneInput"
                       data-bind="ojComponent: {
                       component: 'ojInputText',
                       value: inputCellphone}"/>
            </div>
        </div>
        <div class="oj-flex oj-flex-items-pad">
            <button id="addbutton"
                    data-bind="click: addRow,
                    ojComponent: { component: 'ojButton', label: 'Add to end' }">
            </button>

            <button id="updateButton"
                    data-bind="click: updateRow,
                    ojComponent: { component: 'ojButton', label: 'Update' }">
            </button>
            <button id="removeButton"
                    data-bind="click: removeRow,
                    ojComponent: { component: 'ojButton', label: 'Remove' }">
            </button>
        </div>
    </div>
</div>


3-) Em viewModels crie o arquivo contact.js, com o seguinte conteúdo:

define(['ojs/ojcore', 'knockout', 'jquery', 'ojs/ojknockout', 'promise', 'ojs/ojinputtext', 'ojs/ojinputnumber', 'ojs/ojtable', 'ojs/ojarraytabledatasource','ojs/ojmodel'],
function(oj, ko, $)
{
  function contactViewModel()
  {
    var self = this;

    self.ContCol = ko.observable();
    self.datasource = ko.observable();
    var contactArray = [];
     self.contactObservableArray = ko.observableArray(contactArray);

    self.serviceURL = 'http://localhost:8090/contact/contacts';
    self.parseContact = function(response) {
        return {contactId: response['contactId'],
                firstName: response['firstName'],
                lastName: response['lastName'],
                cellphone: response['cellphone']};
        };
    self.Contact = oj.Model.extend({
                urlRoot: self.serviceURL,
                parse: self.parseContact,
                parseSave: self.parseContact,
                idAttribute: 'contactId'
    });

    self.myCont = new self.Contact();
    self.ContCollection = oj.Collection.extend({
                url: self.serviceURL,
                model: self.myCont
    });

    self.ContCol(new self.ContCollection());

    self.ContCol().fetch({
                    success: function(model, response, options) {
                        for(x=0;x<response.length;x++){
                           self.contactObservableArray.push(response[x]);
                           console.log("Load contacts success");
                        }
                    },
                    error: function(model, xhr, options) {
                         console.log("Load contacts error");
                    }
    });

    self.datasource = new oj.ArrayTableDataSource(self.contactObservableArray, {idAttribute: 'contactId'});

    /** ADD ROW BUTTON **/
    self.addRow = function()
    {
        var addCon = new self.Contact();

        addCon.save({'firstName': self.inputFirstName(),
                     'lastName': self.inputLastName(),
                     'cellphone': self.inputCellphone()},{
                        success: function(model, response, options) {
                            self.contactObservableArray.push(response);
                            console.log("Save contact success");
                        },
                        error: function(model, xhr, options) {
                             console.log("Save contact error");
                        }
        });

    };

    /** UPDATE ROW BUTTON **/
    self.updateRow = function()
    {
        var currentRow = $('#table').ojTable('option', 'currentRow');

        var updateCon = new self.Contact();

        if (currentRow != null){
            updateCon.save({'contactId': self.inputContactId(),
                            'firstName': self.inputFirstName(),
                            'lastName': self.inputLastName(),
                            'cellphone': self.inputCellphone()},{
                                success: function(model, response, options) {
                                    self.contactObservableArray.splice(currentRow['rowIndex'], 1,response);
                                    console.log("Update contact success");
                                },
                                error: function(model, xhr, options) {
                                     console.log("Update contact error");
                                }
            });
        }
    };

    /** DELETE ROW BUTTON **/
    self.removeRow = function()
    {
        var currentRow = $('#table').ojTable('option', 'currentRow');

        if (currentRow != null)
        {

            var destroyContact = self.contactObservableArray()[currentRow['rowIndex']];
            var deleteCon = new self.Contact({'contactId': destroyContact.contactId});

            deleteCon.destroy({
                               success: function(model, response, options) {
                                    self.contactObservableArray.splice(currentRow['rowIndex'], 1);
                                    console.log("Delete contact success");
                               },
                               error: function(model, xhr, options) {
                                    console.log("Delete contact error");
                               }
            });
        }
    };


    self.inputContactId = ko.observable();
    self.inputFirstName = ko.observable();
    self.inputLastName = ko.observable();
    self.inputCellphone = ko.observable();
  }
  var cvm = new contactViewModel;

  /** CURRENT ROW LISTENER **/
  self.currentRowListener = function (event,ui) {

      var currentRow = cvm.contactObservableArray()[ui.currentRow['rowIndex']];
      cvm.inputContactId(currentRow.contactId);
      cvm.inputFirstName(currentRow.firstName);
      cvm.inputLastName(currentRow.lastName);
      cvm.inputCellphone(currentRow.cellphone);

    }

  return cvm;
});

4-) Abra o arquivo index.html e acrescente a div para referenciar a pagina que foi criada.


5-) Teste:


sábado, 13 de maio de 2017

Rest Adapter - SOA Suite 12c

Neste post irei consumir o mesmo serviço Rest criado no post "IntelliJ, Spring Boot and Rest" no SOA Suite 12c usando o "Rest Adapter".
Crie um "Application" e um projeto do Service Bus para fazer este exemplo. Caso tenha duvida de como criar veja no post "Criando e testando Proxy Service no JDeveloper 12c".

Passos:

1-) Arraste o componente "Rest" para "External Service".


2-) Irá abrir uma popup preencha com os seguintes valores:

  • Name: "MyTestReference"
  • Type: "Reference"
  • Reference will beinvoked by components using WSDL interfaces: "true"

Click em "Next"




3-) Na próxima tela, preencha os valores:
Base URI: "http://localhost:8090/mytest"
Resource edite para "/myPostMethod"



4-) Em "Methods" clck no sinal de "+", irá aparecer a seguinte popup:


5-) Preencha os campos com os seguintes valores:
Method: "myPostMethod"
Http Verb: "POST"


6-) Na aba "Request", click na engrenagem "Difine Schema for Native Format" de "Schema URL" e irá aparecer a seguinte popup, click em "Next":



7-) Em "File Name" preencha "myPostRequest.xsd" e click em "Next":



8-) Click em "Next":



9-) Em "Sample" preencha com {"firstName":"string","lastName":"string"} e click em "Next":



10-) Click em "Next":



11-) Click em "Finish":


12-) Voltamos para a popup anterior, selecione o xsd gerado em "Schema URL".
Agora vamos comfigurar o response. Click na aba "Response", em "Payload" selecione "JSON" e execute os mesmos passos (6 a 11) mas para as seguintes configurações:

File Name: "myPostResponse.xsd"
Sample: "{"welcome":"string"}"


Click em "OK".

13-) Click em "Finish":


14-) Foi gerado o business  MyTestReference.bix, click com o botão direito nele selecione "Run" para testarmos:


Na tela de teste, repare que podemos testar tanto em SOAP quanto REST

Teste SOAP:



Teste Rest: