Share Button

A versão 2 do ODataBr (antigo MVCBrODataServer) recebeu novos recursos de melhoria de performance e outros de funcionalidades como segue.

1. Melhorias
– algumas propriedades do FireDAC foram alteradas visando a melhoria de performace – alterações de propriedades;

2. Correções
– Foi feito correção para tabelas JOIN

exemplo: http://localhost:8080/OData/OData.svc/cliente(1)/vendas

no exemplo é feito um JOIN entre os dados do cliente=1 e a tabela de vendas para mostrar as vendas do daquele cliente;

3. Recursos novos

– Adicionado na pasta ./bin/admin o front-end de acesso administrativo para acesso: http://localhost:8080/admin
– Nas instruções PATCH de atualização dos dados no servidor, acrescentado a opção “rowstate”: “modifyORinsert” – tenta fazer um update, caso não encontre nenhum registro então tenta um INSERT;
com isto a propriedade “rowstate” passou a ter as seguintes opções: inserted, updated, modified e modifyORinsert
– proxy para gerar código TypeScript nativo fazendo a chamada: http://localhost:8080/OData/hello/ng irá retornar um código typescript/angular para acesso ao metadata utilizado no servidor;

exemplo: http://localhost:8080/OData/hello/ng


/// <summary>                                 
/// ODataBr - Generate NG5 Script                           
/// Date: 17/01/2018 22:39:46                          
/// Auth:  amarildo lacerda - tireideletra.com.br           
///        gerado pelo Servidor ODataBr: .../OData/hello/ng   
/// </summary>                                 

import { Injectable, Inject } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { ODataProviderService,ODataFactory,ODataService } from './odata-provider.service';
import { Observable } from 'rxjs/Rx';

export interface ODataBrQuery extends ODataService{} 

@Injectable()
export class ODataBrProvider {
  token:string=""; 
  urlBase:string=""; 
  urlPort:number = 8080; 
  headers: HttpHeaders;

  port(aPort:number):ODataBrProvider{
     this.urlPort = aPort;
     return this;
  } 
  url(aUrl:string):ODataBrProvider{
    this.urlBase = aUrl;
    return this;
  }

  getJson(url:string):Observable<any>{
    this.configOptions();
    return this._odata.getJson(url);
  }
  getOData(query:ODataService):ODataProviderService{
    this.configOptions();
    return this._odata.getValue(query);
  }
  private configOptions(){ 
      if (this.token!="") { this._odata.token = this.token; }; 
      this._odata.createUrlBase(this.urlBase,this.urlPort); 
      if (this.headers.keys().length>0) {
        //this._odata.headers.clear;
        for(let item of this.headers.keys() ){ 
          this._odata.headers.set(item,this.headers.get(item));
         }
      }
  }

constructor(private _odata:ODataProviderService ) {
       this.headers = new HttpHeaders(); 
}
   get_filial( query:ODataBrQuery ):ODataProviderService { 
      this.configOptions(); 
      query.resource = "filial"+(query.join?query.join:"");
      return this._odata.getValue( query ); 
   }

   get_produtos( query:ODataBrQuery ):ODataProviderService { 
      this.configOptions(); 
      query.resource = "produtos"+(query.join?query.join:"");
      return this._odata.getValue( query ); 
   }
...
}

– Adicionado classe base em Typescript/Angular para acesso o servidor OData com a estrutura fundamental de acesso aos dados
Classe typescript/angular para acesso ao servidor

Exemplo de utilização da classe typescript/angular é possível consulta o font-end de “admin” em: http://front-end admin

ver também:
introdução ao oData

Share Button

Estava pesquisando como fazer coleta de temperatura para uma solução de Angular5 implementando com Typescript; A solução é bem simples, mas pode ajudar aqueles que estejam buscando tal solução;

Implementando a classe “provider”

/*
  <summary>
    subject: weather-service para acessar  openweathermap
    auth: amarildo lacerda   <tireideletra.com.br>
    uso:
        - providers: [ 
                WeatherService,..]

        - para enviar pedido de temperatura:
          ngOnInit() {
             this._weather.getWeatherbyName("SAO PAULO,BR").subscribe(rsp => {
             this.weather.fillWeather(rsp);
             console.log(this.weather.response());
          });
        }
        - ...fillWeather -> preenche os dados retornados do json  
  
  </summary>

*/
import { Injectable } from '@angular/core';
import { Http, Response, URLSearchParams } from '@angular/http';
import { Observable } from 'rxjs/Rx'; /// para corrigir erro do catch

export interface Coord {
    lon: number;
    lat: number;
}

export class Weather {
    temp: any;
    temp_max: any;
    temp_min: any;
    description: string;
    city: string;
    county:string;
    date: any;
    pressure: any;
    humidity: any;
    sunrise: any;
    coord: Coord;
    wind:any;
    weather:any;
    private resp: any;
    response() {
        return this.resp;
    }
    public fillWeather(body: any) {
        this.resp = body;
        this.city = body.name;
        this.county = body.sys.country;
        this.description = body.weather[0].main;
        this.temp = body.main.temp.toFixed(0);
        this.temp_max = body.main.temp_max;
        this.temp_min = body.main.temp_min;
        this.pressure = body.main.pressure;
        this.humidity = body.main.humidity;
        this.date = new Date(body.dt * 1000);
        this.sunrise = new Date(body.sys.sunrise * 1000);
        this.coord = body.coord;
        this.wind = body.wind;
        this.weather = body.weather;
    }

}

@Injectable()
export class WeatherService {
    city: string = "Sao Paulo,BR";

    urlAPI = "http://api.openweathermap.org/data/2.5/weather";
    tokenAPI = ""; //gerar uma API no provedor - esta é limitada 
    units = "metric";

    constructor(private http: Http) {

    }

    getWeatherbyName(localName: string = "Sao Paulo,BR", api:string="") {
        if (localName == "") {
            localName = this.city;
        }
        if (api==""){
            api = this.tokenAPI;
        }
        console.log(localName);
        let myParams = new URLSearchParams();
        myParams.append('appid', api);
        myParams.append('q', localName);
        myParams.append('units', this.units);
        return this.http.get(this.urlAPI, { search: myParams })
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body;
    }

    private handleError(error: Response | any) {
        console.error(error.message || error);
        return Observable.throw(error.message || error);
    }

}

Usando o “Provider”


import { Component, OnInit } from '@angular/core';
import { WeatherService, Weather } from './weather-service';

const 
  token = "gerar um token no site - openweathermap";
const  
  local = "SAO PAULO,BR";

@Component({
  selector: 'app-previsao-tempo',
  template: '<div>{{weather.city}}: {{weather.temp}}c </div> \
             Min: {{weather.temp_min}}c Max: {{weather.temp_max}}c ',
  styleUrls: []
})
export class PrevisaoTempoComponent implements OnInit {
  weather: Weather = new Weather();
  constructor(private _weather: WeatherService) {
  }
  ngOnInit() {
    this._weather.getWeatherbyName(local,token).subscribe(rsp => {
      this.weather.fillWeather(rsp);
      console.log(this.weather.response());
    });
  }
  
}