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
[code]

/// <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 );
}

}

[/code]

– 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

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”
[code]
/*
<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);
}

}

[/code]

Usando o “Provider”

[code]

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());
});
}

}

[/code]