API REST
Este manual descreve os passos necessários para efetuar a integração do Servidor WebFeeder
com a aplicação cliente que irá consumir os dados oriundos do mesmo.
Considerações Iniciais
O Web Feeder foi desenvolvido usando a arquitetura REST (Representational State Transfer),
uma técnica de engenharia de software para sistemas hipermídia distribuídos como a World Wide
Web. Está arquitetura é usada para descrever qualquer interface web simples que utiliza XML e
HTTP (ou mesmo YAML, JSON e texto puro), sem as abstrações adicionais dos protocolos
baseados em padrões de trocas de mensagem como o protocolo de serviços web SOAP. O
REST se utiliza do protocolo HTTP diferente de SOAP que cria um novo protocolo sobre o HTTP
e trabalha com classes de retorno que são 5, o número inicial do código de retorno indica a classe
de retorno, por exemplo o retorno 200 é da classe 2 que é sucesso.
Arquitetura de Comunicação
O WebFeeder fornece diversas informações, onde o fluxo da informação é iniciado através da
autenticação do consumidor, o mesmo efetua a autenticação e através do “HTTPSession” gerado
pode-se iniciar o consumo, a cada requisição o tempo de expiração deste “HTTPSession” é
reciclado, sendo de responsabilidade do consumidor efetuar nova autenticação quando o mesmo
identificar que a sessão não é mais valida. A arquitetura de comunicação do WebFeeder permite
que o cliente faça uma requisição, e o mesmo executa a busca desta solicitação de acordo com o
requisitado, processa esta requisição e a devolve no formato desejado.
Padrões Técnicos
O serviço pode ser consumido e ter duas formas de retorno JSON e XML, sendo eles:
1. JSON (JavaScript Object Notation) - é uma das principais notações para intercâmbio de
dados entre aplicativos, que é possível utilizar com mais de 20 linguagens de programação
diferentes. Para maiores informações esta disponível a documentação completa e
exemplos de estruturas no site oficial do Json: [Link] segue abaixo um
exemplo do retorno JSON:
{"Aluno":[ {"nome":"João","notas":[8,9,7]}, {"nome":"Maria","notas":[8,10,7]},
{"nome":"Pedro","notas":[10,10,9]} ] }
2. XML (Extensible Markup Language) - é uma recomendação W3C para gerar linguagens de
marcação para uma necessidade especial, seu propósito principal é a facilidade de
compartilhamento de informações na internet, e a principal característica é de criar uma
infraestrutura única par diversas linguagens. Para maiores informações esta disponível a
documentação completa e exemplos de estruturas no site oficial do XML:
<?xmlversion="1.0"encoding="ISO-8859-1"?> <receitanome="pão"tempo_de_preparo="5
minutos"tempo_de_cozimento="1 hora"> <titulo>Pão simples</titulo> <ingredientes>
<ingredientequantidade="3"unidade="xícaras">Farinha</ingrediente>
<ingredientequantidade="7"unidade="gramas">Fermento</ingrediente>
<ingredientequantidade="1.5"unidade="xícaras"estado="morna">Água</ingrediente>
<ingredientequantidade="1"unidade="colheres de chá">Sal</ingrediente> </ingredientes>
<instrucoes> <passo>Misture todos os ingredientes, e dissolva bem.</passo><passo>Cubra
com um pano e deixe por uma hora em um local morno.</passo> <passo>Misture novamente,
coloque numa bandeja e asse num forno.</passo> </instrucoes> </receita>
Autenticação
O Servidor Web Feeder exige que o cliente possua um sessão válida para efetuar o consumo de
dados do mesmo (Veja no final deste documento um exemplo de conexão).
Para receber os dados, é necessário realizar a autenticação com o servidor Web Feeder, através
do método: SignIn.
A sessão que iremos utilizar para as requisições de consumo será sempre a mesma, quando esta
sessão não conseguir se autenticar, deve executar o mesmo método de login para renovar a
sessão.
A requisição do evento login tem um retorno de uma String contendo “true” ou “false”.
URL de Autenticação:
[Link]
Para efetuar o consumo de um serviço disponibilizado pelo WebFeeder é necessário enviar uma
requisição utilizando a mesma sessão do evento login.
HTTP Status code
Código Descrição
200 Sucesso
401 Não autorizado
404 Metodo não encontrado
405 Requisição não permitida
408 Requisição retornou timeout
504 Gateway timeout
Para que a requisição venha no formato JSON, não é necessário adicionar nenhum parâmetro,
porém para que a requisição tenha o retorno XML é necessário ao fim da URL adicionar “/xml” .
Exemplo Requisição XML:
[Link]
Serviços da API
Quote
O serviço retorna os dados referentes ao ativo ou ativos solicitados, o método é do tipo GET.
Formato da Requisição
[Link]
[Link]
Exemplo Requisição
[Link]
[Link]
Retorno
Campo Descrição
symbol Símbolo do ativo
timeUpdate Data e hora da última atualização
dateTrade Data e hora do último negócio
lastTrade Último preço
previous Preço de fechamento anterior
change Variação no dia
changeMonth Variação no mês
bid Preço na compra
ask Preço na venda
timeLastTrade Data e hora do último negócio
dateTradeObj Data da última modificação
quantity Quantidade do negócio atual
quantityLast Quantidade do último negócio
quantityTrades Quantidade de negócios realizados
volumeAmount Volume quantitativo de negócios
volumeFinancier Volume financeiro de negócios
high Máxima do dia
low Mínima do dia
timeBid Horário da melhor oferta de compra
timeAsk Horário da melhor oferta de venda
volumeBid Volume acumulado das melhores ofertas de compra
volumeAsk Volume acumulado das melhores ofertas de venda
volumeBetterBid Volume da melhor oferta de compra
volumeBetterAsk Volume da melhor oferta de venda
lastTradeLastWeek Preço de fechamento da última semana
lastTradeLastMonth Preço de fechamento do último mês
lastTradeLastYear Preço de fechamento do último ano
playerBid Código da corretora na compra
interest Quantidade de contratos abertos
Situation Estado do ativo
Average Preço médio do dia
execPrice Preço de exercício
tickSize Quantidade de casas decimais do papel
timeLastTradeSting Horário do último negócio
dateLastTradeString Data do último negócio
marketCode Código do mercado
contractMultiplier Fator de multiplicação
volumeAverageLast20Days Volume médio dos últimos 20 dias
marketCap Valor total de todas as ações da empresa
variation7Days Variação semanal
variation1Month Variação mensal
variation1Year Variação anual
variationVolumeInHour Variação em uma hora
variationVolumeToHour Variação na última hora
variationVolumeInDay Variação em um dia
theoryPrice Preço teórico
theoryQuantity Quantidade teórica
loteDefault Lote padrão
minIntervalIncrPrice Incremento mínimo
quotationForm Forma de cotação
adjustmentDay Ajuste
adjustmentPreviousDay Ajuste anterior
Exemplo do retorno
"symbol": "petr4",
"timeUpdate": "15-10-2019 17:33:21",
"dateTrade": "15-10-2019 00:00:00",
"lastTrade": 27.59,
"previous": 27.31,
"change": 1.0252714,
"changeMonth": 0.14519691,
"bid": 27.57,
"ask": 27.59,
"timeLastTrade": "15-10-2019 17:33:21",
"dateTradeObj": "Oct 15, 2019 12:00:00 AM",
"quantity": 300.0,
"quantityLast": 300.0,
"quantityTrades": 36287.0,
"volumeAmount": 3.02238E7,
"volumeFinancier": 8.3612787E8,
"high": 27.88,
"low": 27.31,
"open": 27.31,
"timeBid": "17:35:09",
"timeAsk": "16:27:39",
"volumeBid": 6100.0,
"volumeAsk": 4700.0,
"volumeBetterBid": 100.0,
"volumeBetterAsk": 4700.0,
"lastTradeLastWeek": 27.26,
"lastTradeLastMonth": 27.55,
"lastTradeLastYear": 22.44,
"playerBid": "262",
"interest": 5.6020429E9,
"situation": "0",
"average": 27.665,
"execPrice": 0.0,
"tickSize": 2,
"timeLastTradeSting": "173321",
"dateLastTradeString": "20191015",
"marketCode": 1,
"contractMultiplier": 1.0,
"volumeAverageLast20Days": 4.0803396E7,
"marketCap": 3.72264075E11,
"variation7Days": 0.0,
"variation1Month": 0.0,
"variation1Year": 0.0,
"variationVolumeInHour": 66.247,
"variationVolumeToHour": 74.069,
"variationVolumeInDay": 51.000412,
"theoryPrice": 0.0,
"theoryQuantity": 0.0,
"loteDefault": 100,
"minIntervalIncrPrice": 0.01,
"quotationForm": 1,
"adjustmentDay": 0.0,
"adjustmentPreviousDay": 0.0
}
Exemplo de Conexão (JAVA):
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class SendRequest {
private static String sessionID = null;
private static String server = "[Link]";
private static String login = "login";
private static String password = "123456";
private static String symbol = "petr4";
public static void main(String[] args) {
sessionID = signIn();
quote(symbol);
}
public static String signIn() {
HttpURLConnection con = null;
String sessionId = null;
try {
String urlParameter = "[Link] + server + "/SignIn?login=" +
login + "&password=" + password;
URL url = new URL(urlParameter);
con = (HttpURLConnection) [Link]();
[Link]("POST");
[Link](true);
[Link](true);
[Link]("Content-Type", "application/x-www-form-
urlencoded");
int httpResult = [Link]();
if (httpResult == HttpURLConnection.HTTP_OK || httpResult > 0) {
BufferedReader in = new BufferedReader(new
InputStreamReader([Link](), "UTF-8"));
StringBuilder builder = new StringBuilder();
String inputLine;
while ((inputLine = [Link]()) != null) {
[Link](inputLine);
}
[Link]();
String msg = [Link]();
sessionId = [Link]("Set-Cookie");
if (msg != "")
return sessionId;
} catch (MalformedURLException e) {
sessionId = null;
[Link]([Link]());
} catch (IOException e) {
sessionId = null;
[Link]([Link]());
} catch (Exception e) {
sessionId = null;
[Link]([Link]());
} finally {
[Link]();
}
return null;
}
public static String quote(String symbol) {
BufferedReader rd = null;
StringBuilder sb = null;
String line = null;
HttpURLConnection con = null;
try {
String server = "[Link]";
String urlParameter = "[Link] + server +
"/services/quotes/quote/" + symbol;
URL url = new URL(urlParameter);
con = (HttpURLConnection) [Link]();
[Link]("GET");
[Link]("Content-Type", "application/x-www-form-
urlencoded");
// [Link]("Accept", "/");
[Link]("Cookie", sessionID);
[Link]();
rd = new BufferedReader(new
InputStreamReader([Link]()));
sb = new StringBuilder();
while ((line = [Link]()) != null) {
[Link](line + '\n');
}
[Link]([Link]());
return [Link]();
} catch (MalformedURLException e) {
[Link]();
} catch (ProtocolException e) {
[Link]();
} catch (IOException e) {
[Link]();
} finally {
[Link]();
}
return "";
}