O OData, Open Data Protocol, é um protocolo aberto que permite a criação e consumo de APIs RESTful de maneira simples e padrão. As APIs de entidade na Senior, atualmente, utilizam apenas parte do Query Data. Mais especificamente, as opções filter e orderby.
Para consumir as APIs de entidade é necessário seguir os padrões:
Obs.: Caso a entidade exija autenticação, é necessário incluir no HTTP Header o “Authorization: Bearer {access-token}”. Para obter o access-token, favor consultar o Tutorial da API Authentication.
Ao efetuar uma chamada para uma entidade, por padrão, são retornados todos os registros da entidade. Porém, com o OData, é possível restringir os registros retornados, utilizando o parâmetro filter. O exemplo abaixo retornará todos os registros da entidade visitType (tipos de visita), do domínio sam, serviço lobby, cujos ids sejam maior que 2 e menor que 5, ou seja, os registros com id igual a 3 e 4.
Abaixo é mostrada uma tabela contendo os operadores e funções suportados pela busca com filtro:
Operador | Descrição | Exemplo |
eq | = (igual) | filter=id eq 10 |
ne | <> (diferente) | filter=id ne 10 |
lt | < (menor que) | filter=id lt 10 |
gt | > (maior que) | filter=id gt 10 |
le | <= (menor ou igual) | filter=id le 10 |
ge | >= (maior ou igual) | filter=id ge 10 |
is | Verifica se parâmetro é nulo | filter=id is null |
containing | Contendo valor da direita no atributo da esquerda | filter=containing(name, 'albert') |
lower | Função de caixa baixa | filter=containing(lower(name), lower('Albert')) |
and | E | filter=id eq 10 and status eq 'y' |
or | Ou | filter=id eq 10 or id eq 20 |
Abaixo é apresentada uma tabela contento exemplos de filtros e os tipos de campos suportados:
Campo da entidade: tipo | Exemplo |
stringField: string | filter=stringField eq 'this is a plane text' |
booleanField: boolean | filter=booleanField eq true |
integerField: integer | filter=integerField ge 12345 |
doubleField: double | filter=doubleField eq 5890.159 |
dateField: date | filter=dateField eq '2018-04-04' |
timeField: time | filter=timeField eq '12:40:38' |
dateTimeField: dateTime | filter=dateTimeField eq '2018-04-04T12:40:38.155Z' |
moneyField: money | filter=moneyField gt 1234567890.098 |
enumField: fruit | filter=enumField eq APPLE |
uuidField: uuid | filter=uuidField eq 'a9abe17c-ac41-43bf-9d35-52cb8034d486' |
binaryField: binary | Não suportado |
Com o orderby é possível definir a ordem em que os registros de uma entidade devem ser retornados. Pode ser feito com qualquer campo do retorno, até quatro níveis. E por padrão a ordenação é sempre em ordem crescente. Caso haja a necessidade de ordenar em ordem decrescente, basta adicionar um espaço em branco e o termo desc após o nome do atributo. Como demonstramos no exemplo abaixo, que retornará todos os registros de tipos de visita ordenados pelo nome em ordem decrescente:
Também é possível filtrar e efetuar a ordenação por mais de um campo, basta separá-los por vírgula:
Essas opções são extras, não fazem parte do OData, mas que visam facilitar o desenvolvimento.
Essas duas opções estão relacionadas a quantidade de registros por página (size) e o número da página a ser recuperada (offset), lembrando que a numeração de página começa em 0 (zero).
No exemplo abaixo temos um exemplo de consulta, para retornar 2 registros na página 1, ordenado pelo nome.
Com o displayfields é possível informar quais campos da entidade devem ser retornados pela API, visto que, por padrão, são retornados todos os campos da entidade (os relacionamentos não são retornados por padrão, apenas os atributos da própria entidade). Essa opção permite reduzir o tamanho da resposta. Para isso basta informar os campos separados por vírgula, conforme exemplo abaixo:
Para buscar os relacionamentos da entidade é necessário passar o relacionamento juntamente com os atibutos da entidade relacionada, conforme exemplo abaixo:
Caso seja utilizado o displayFields para buscar entidades relacionadas, apenas o atributo id da entidade será carregado por padrão. Para buscar as informações da entidade e mais as informações da entidade relacionada é possível utilizar o displayFields conforme o exemplo abaixo:
Dessa forma o * serve para carregar os atributos do vacancy (entidade) e o jobPosition.* serve para carregar os atributos do jobPosition (entidade relacionada com o vacancy)