Mostrando postagens com marcador Rest. Mostrar todas as postagens
Mostrando postagens com marcador Rest. Mostrar todas as postagens

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:



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: