From 3e6ef26021c099e83b961935f80360bc4d649793 Mon Sep 17 00:00:00 2001 From: logannas Date: Wed, 27 Mar 2024 08:52:32 -0300 Subject: [PATCH 1/2] feat: update README --- README.md | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++- dims.jpg | Bin 0 -> 26649 bytes 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 dims.jpg diff --git a/README.md b/README.md index d353240..5e05401 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,139 @@ + # DevKit-Software -DevKit de Software + + O UIoT DIMS é uma plataforma de middleware aberta para Internet das Coisas (IoT), projetada para gerenciar e armazenar dados provenientes de dispositivos IoT. Mantida pela Universal Internet of Things e pela Universidade de Brasília, o DIMS atua como uma camada entre aplicativos/dispositivos IoT e o sistema de armazenamento. + + + +## Arquitetura do DIMS +O DIMS (Data Interface Management System) é um componente do UIoT, desenvolvido para gerenciar a interface de dados entre dispositivos IoT e o sistema de armazenamento. Ele recebe dados de sensores IoT e os armazena em um banco de dados, assegurando persistência e permitindo análises futuras. + +![screenshot](dims.jpg) + +### Funcionalidades Principais do DIMS: +- Recebimento de dados em tempo real de sensores IoT. +- Armazenamento seguro e confiável dos dados em um banco de dados centralizado. +- Fornecimento de uma interface padronizada para integração com dispositivos IoT. +- Suporte para análises posteriores e visualizações de dados. +- Escalabilidade para lidar com grandes volumes de dados de dispositivos IoT. + +O DIMS é estruturado em três componentes principais: +- Cliente: Representa os dispositivos físicos de hardware, como Arduino, Raspberry Pi, etc. +- Serviços: Correspondem aos diferentes tipos de sensores presentes nos dispositivos físicos. +- Dados: Consiste nos dados gerados pelos sensores dos dispositivos físicos. +Essa divisão simplifica a compreensão da plataforma e dos fluxos de dados. + +## Configuração e Utilização do DIMS +Para começar a utilizar o DIMS, é necessário entender os pontos de acesso e os passos iniciais para o envio de dados. +### Acesso aos Endpoints +- Endpoint principal do DIMS: http://dims.uiot.redes.unb.br. +- Documentação Swagger da API: http://dims.uiot.redes.unb.br/docs. +### Cadastro de Cliente +Para enviar dados ao DIMS, é preciso registrar um cliente via POST no endpoint http://dims.uiot.redes.unb.br/client, com o seguinte esquema: + +``` +{ + "clientTime": "2020-03-04T12:14:25", + "tags": ["example-tag"], + "name": "Raspberry PI", + "chipset": "AMD 790FX", + "mac": "FF:FF:FF:FF:FF:FF", + "serial": "C210", + "processor": "Intel I3", + "channel": "Ethernet", + "location": "-15.7757876:-48.077829" +} +``` +Após o cadastro do cliente, é possível criar serviços associados a ele. + +### Cadastro de Serviço +Cada cliente pode ter vários serviços diferentes. Para cadastrar um serviço, utilize o endpoint via POST http://dims.uiot.redes.unb.br/service, com o seguinte esquema: +``` +{ + "clientTime": 1000000000.1, + "tags": [ + "example-tag" + ], + "number": 3, + "chipset": "AMD 790FX", + "mac": "FF:FF:FF:FF:FF:FF", + "name": "Get temp", + "parameter": "temperature", + "unit": "°C", + "numeric": 1 +} + +``` +O chipset e o mac são referentes ao cliente, enquanto os demais parâmetros são relacionados às características do serviço. +### Envio de Dados +Após o cadastro do cliente e do serviço, é possível enviar dados ao DIMS utilizando o endpoint POST http://dims.uiot.redes.unb.br/data, com o seguinte esquema: +``` +{ + "clientTime": 1000000000.1, + "time": "2018-09-21T17:42:12.587934", + "tags": [ + "example-tag" + ], + "sensitive": 1, + "chipset": "AMD 790FX", + "mac": "FF:FF:FF:FF:FF:FF", + "serviceNumber": 3, + "value": [ + "20.2", + "30.0" + ] +} +``` +Os parâmetros chipset e mac são relacionados ao cliente, enquanto serviceNumber é relacionado ao serviço. O parâmetro de sensitive é relacionado a qual importância desse dado que está sendo enviado. + + +Essas etapas permitem a integração e o envio eficiente de dados ao DIMS para posterior análise e utilização. + +### Listagem de Clientes, Serviços e Dados +Para listar todos os clientes, serviços e dados, utilize o método GET nos seguintes endpoints, respectivamente: +- http://dims.uiot.redes.unb.br/list/client +- http://dims.uiot.redes.unb.br/list/service +- http://dims.uiot.redes.unb.br/list/data + +Para acessar informações detalhadas sobre clientes, serviços e dados registrados, utilize os métodos GET nos seguintes endpoints: +#### Client: +- Listar por nome: + - Exemplo: http://dims.uiot.redes.unb.br/list/client?name=HumidityCenter +- Listar por canal: + - Exemplo: http://dims.uiot.redes.unb.br/list/client?channel=IEEE808002.11b +- Listar por chipset: + - Exemplo: http://dims.uiot.redes.unb.br/list/client?chipset=AMD%20790FX +- Listar por endereço MAC: + - Exemplo: http://dims.uiot.redes.unb.br/list/client?mac=FF:FF:FF:FF:FF +- Listar uma quantidade específica dos últimos cadastrados: + - Exemplo: http://dims.uiot.redes.unb.br/list/client?latest=10 +#### Service: +- Listar por nome: + - Exemplo: http://dims.uiot.redes.unb.br/list/service?name=GetTemp +- Listar por parâmetros: + - Exemplo: http://dims.uiot.redes.unb.br/list/service?parameters=humidity +- Listar por chipset: + - Exemplo: http://dims.uiot.redes.unb.br/list/service?chipset=AMD%20790FX +- Listar por endereço MAC: + - Exemplo: http://dims.uiot.redes.unb.br/list/service?mac=FF:FF:FF:FF:FF +- Listar uma quantidade específica dos últimos cadastrados: + - Exemplo: http://dims.uiot.redes.unb.br/list/service?latest=10 +#### Data: +- Listar por sensibilidade: + - Exemplo: http://dims.uiot.redes.unb.br/list/data?sensitive=1 +- Listar por chipset: + - Exemplo: http://dims.uiot.redes.unb.br/list/data?chipset=AMD%20790FX +- Listar por endereço MAC: + - Exemplo: http://dims.uiot.redes.unb.br/list/data?mac=FF:FF:FF:FF:FF +- Listar por número do serviço: + - Exemplo: http://dims.uiot.redes.unb.br/list/data?serviceNumber=3 +- Listar por data: + - Exemplo: + http://dims.uiot.redes.unb.br/list/data?from=1995-09-07T10:40:52Z + http://dims.uiot.redes.unb.br/list/data?until=1998-09-07T10:40:52Z + http://dims.uiot.redes.unb.br/list/data?from=1995-09-07T10:40:52Z&until=1998-09-07T10:40:52Z +- Listar uma quantidade específica dos últimos cadastrados: + - Exemplo: http://dims.uiot.redes.unb.br/list/data?latest=10 + +Esses parâmetros permitem filtrar os resultados para atender às necessidades específicas de consulta. + diff --git a/dims.jpg b/dims.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c4d128afc24641760ec5b1ad8760027a79e9956 GIT binary patch literal 26649 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 Date: Wed, 27 Mar 2024 08:52:48 -0300 Subject: [PATCH 2/2] feat: add dims postman collection --- postman-docs/DIMS.postman_collection.json | 545 ++++++++++++++++++++++ 1 file changed, 545 insertions(+) create mode 100644 postman-docs/DIMS.postman_collection.json diff --git a/postman-docs/DIMS.postman_collection.json b/postman-docs/DIMS.postman_collection.json new file mode 100644 index 0000000..6384412 --- /dev/null +++ b/postman-docs/DIMS.postman_collection.json @@ -0,0 +1,545 @@ +{ + "info": { + "_postman_id": "4497312b-2a35-4038-8b5a-8e727735b2fc", + "name": "DIMS", + "description": "**O UIoT DIMS é uma plataforma de middleware aberta para Internet das Coisas (IoT), projetada para gerenciar e armazenar dados provenientes de dispositivos IoT. Mantida pela Universal Internet of Things e pela Universidade de Brasília, o DIMS atua como uma camada entre aplicativos/dispositivos IoT e o sistema de armazenamento.**\n\n## **Visão Geral**\n\n**O DIMS (Data Interface Management System) é um componente do UIoT, desenvolvido para gerenciar a interface de dados entre dispositivos IoT e o sistema de armazenamento. Ele recebe dados de sensores IoT e os armazena em um banco de dados, assegurando persistência e permitindo análises futuras.**\n\n\n\n**Figura 1 - Arquitetura do DIMS**\n\n### **Funcionalidades Principais do DIMS:**\n\n- **Recebimento de dados em tempo real de sensores IoT.**\n- **Armazenamento seguro e confiável dos dados em um banco de dados centralizado.**\n- **Fornecimento de uma interface padronizada para integração com dispositivos IoT.**\n- **Suporte para análises posteriores e visualizações de dados.**\n- **Escalabilidade para lidar com grandes volumes de dados de dispositivos IoT.**\n \n\n**O DIMS é estruturado em três componentes principais:**\n\n- **Cliente: Representa os dispositivos físicos de hardware, como Arduino, Raspberry Pi, etc.**\n- **Serviços: Correspondem aos diferentes tipos de sensores presentes nos dispositivos físicos.**\n- **Dados: Consiste nos dados gerados pelos sensores dos dispositivos físicos.**\n \n\n**Essa divisão simplifica a compreensão da plataforma e dos fluxos de dados.**\n\n## **Configuração e Utilização do DIMS**\n\n**Para começar a utilizar o DIMS, é necessário entender os pontos de acesso e os passos iniciais para o envio de dados.**\n\n### **Acesso aos Endpoints**\n\n- **Endpoint principal do DIMS:** [https://dims.uiot.unb.br:8080](http://dims.uiot.unb.br:8080)**.**\n- **Documentação Swagger da API:** [https://dims.uiot.unb.br:8080/docs](http://dims.uiot.unb.br:8080/docs)**.**\n \n\n### **Cadastro de Cliente**\n\n**Para enviar dados ao DIMS, é preciso registrar um cliente via POST no endpoint** [https://dims.uiot.unb.br:8080/client](http://dims.uiot.unb.br:8080/client)**. Abaixo está um exemplo do corpo da requisição:**\n\n**Após o cadastro do cliente, é possível criar serviços associados a ele.**\n\n### **Cadastro de Serviço**\n\n**Cada cliente pode ter vários serviços diferentes. Para cadastrar um serviço, utilize o endpoint via POST** [https://dims.uiot.unb.br:8080/service](http://dims.uiot.unb.br:8080/service) **com o seguinte esquema:**\n\n**O chipset e o mac são referentes ao cliente, enquanto os demais parâmetros são relacionados às características do serviço.**\n\n### **Envio de Dados**\n\n**Após o cadastro do cliente e do serviço, é possível enviar dados ao DIMS utilizando o endpoint POST** [https://dims.uiot.unb.br:8080/data](http://dims.uiot.unb.br:8080/data)**. Abaixo está um exemplo do corpo da requisição:**\n\n**Os parâmetros chipset e mac são relacionados ao cliente, enquanto serviceNumber é relacionado ao serviço. O parâmetro de sensitive é relacionado a qual importância desse dado que está sendo enviado.**\n\n**Essas etapas permitem a integração e o envio eficiente de dados ao DIMS para posterior análise e utilização.**\n\n### **Listagem de Clientes, Serviços e Dados**\n\n**Para listar todos os clientes, serviços e dados, utilize o método GET nos seguintes endpoints, respectivamente:**\n\n- [https://dims.uiot.unb.br:8080/list/client](http://dims.uiot.unb.br:8080/list/client)\n- [https://dims.uiot.unb.br:8080/list/service](http://dims.uiot.unb.br:8080/list/service)\n- [https://dims.uiot.unb.br:8080/list/data](http://dims.uiot.unb.br:8080/list/data)\n \n\n**Para acessar informações detalhadas sobre clientes, serviços e dados registrados, utilize os métodos GET nos seguintes endpoints:**\n\n#### **Client:**\n\n- **Listar por nome:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/client?name=HumidityCenter](http://dims.uiot.unb.br:8080/list/client?name=HumidityCenter)\n- **Listar por canal:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/client?channel=IEEE808002.11b](http://dims.uiot.unb.br:8080/list/client?channel=IEEE808002.11b)\n- **Listar por chipset:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/client?chipset=AMD](http://dims.uiot.unb.br:8080/list/client?chipset=AMD) **790FX**\n- **Listar por endereço MAC:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/client?mac=FF:FF:FF:FF:FF](http://dims.uiot.unb.br:8080/list/client?mac=FF:FF:FF:FF:FF)\n- **Listar uma quantidade específica dos últimos cadastrados:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/client?latest=10](http://dims.uiot.unb.br:8080/list/client?latest=10)\n\n#### **Service:**\n\n- **Listar por nome:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/service?name=GetTemp](http://dims.uiot.unb.br:8080/list/service?name=GetTemp)\n- **Listar por parâmetros:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/service?parameters=humidity](http://dims.uiot.unb.br:8080/list/service?parameters=humidity)\n- **Listar por chipset:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/service?chipset=AMD](http://dims.uiot.unb.br:8080/list/service?chipset=AMD) **790FX**\n- **Listar por endereço MAC:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/service?mac=FF:FF:FF:FF:FF](http://dims.uiot.unb.br:8080/list/service?mac=FF:FF:FF:FF:FF)\n- **Listar uma quantidade específica dos últimos cadastrados:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/service?latest=10](http://dims.uiot.unb.br:8080/list/service?latest=10)\n\n#### **Data:**\n\n- **Listar por sensibilidade:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/data?sensitive=1](http://dims.uiot.unb.br:8080/list/data?sensitive=1)\n- **Listar por chipset:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/data?chipset=AMD](http://dims.uiot.unb.br:8080/list/data?chipset=AMD) **790FX**\n- **Listar por endereço MAC:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/data?mac=FF:FF:FF:FF:FF](http://dims.uiot.unb.br:8080/list/data?mac=FF:FF:FF:FF:FF)\n- **Listar por número do serviço:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/data?serviceNumber=3](http://dims.uiot.unb.br:8080/list/data?serviceNumber=3)\n- **Listar por data:**\n - **Exemplo:**\n - [https://dims.uiot.unb.br:8080/list/data?from=1995-09-07T10:40:52Z](http://dims.uiot.unb.br:8080/list/data?from=1995-09-07T10:40:52Z)\n - [https://dims.uiot.unb.br:8080/list/data?until=1998-09-07T10:40:52Z](http://dims.uiot.unb.br:8080/list/data?until=1998-09-07T10:40:52Z)\n - [https://dims.uiot.unb.br:8080/list/data?from=1995-09-07T10:40:52Z&until=1998-09-07T10:40:52Z](http://dims.uiot.unb.br:8080/list/data?from=1995-09-07T10:40:52Z&until=1998-09-07T10:40:52Z)\n- **Listar uma quantidade específica dos últimos cadastrados:**\n - **Exemplo:** [https://dims.uiot.unb.br:8080/list/data?latest=10](http://dims.uiot.unb.br:8080/list/data?latest=10)\n\n**Esses parâmetros permitem filtrar os resultados para atender às necessidades específicas de consulta.**", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "14839151" + }, + "item": [ + { + "name": "Client", + "item": [ + { + "name": "client", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"clientTime\": \"2020-03-04T12:14:25\",\n \"tags\": [\"example-tag\"],\n \"name\": \"Raspberry PI\",\n \"chipset\": \"AMD 790FX\",\n \"mac\": \"FF:FF:FF:FF:FF:FF\",\n \"serial\": \"C210\",\n \"processor\": \"Intel I3\",\n \"channel\": \"Ethernet\",\n \"location\": \"-15.7757876:-48.077829\"\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/client", + "host": [ + "{{url}}" + ], + "path": [ + "client" + ] + } + }, + "response": [] + }, + { + "name": "list/client", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ] + } + }, + "response": [] + }, + { + "name": "list/client - filter name", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client?name=Raspberry PI", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ], + "query": [ + { + "key": "name", + "value": "Raspberry PI" + } + ] + } + }, + "response": [] + }, + { + "name": "list/client - filter channel", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client?channel=Ethernet", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ], + "query": [ + { + "key": "channel", + "value": "Ethernet" + } + ] + } + }, + "response": [] + }, + { + "name": "list/client - filter chipset", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client?chipset=AMD 790FX", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ], + "query": [ + { + "key": "chipset", + "value": "AMD 790FX" + } + ] + } + }, + "response": [] + }, + { + "name": "list/client - filter mac", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client?mac=FF:FF:FF:FF:FF:FF", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ], + "query": [ + { + "key": "mac", + "value": "FF:FF:FF:FF:FF:FF" + } + ] + } + }, + "response": [] + }, + { + "name": "list/client - filter latest", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/client?latest=2", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "client" + ], + "query": [ + { + "key": "latest", + "value": "2" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Service", + "item": [ + { + "name": "service", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"clientTime\": 1000000000.1,\n \"tags\": [\n \"example-tag\"\n ],\n \"number\": 3,\n \"chipset\": \"AMD 790FX\",\n \"mac\": \"FF:FF:FF:FF:FF:FF\",\n \"name\": \"Get temp\",\n \"parameter\": \"temperature\",\n \"unit\": \"°C\",\n \"numeric\": 1\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/service", + "host": [ + "{{url}}" + ], + "path": [ + "service" + ] + } + }, + "response": [] + }, + { + "name": "list/service", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ] + } + }, + "response": [] + }, + { + "name": "list/service - filter name", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service?name=Get temp", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ], + "query": [ + { + "key": "name", + "value": "Get temp" + } + ] + } + }, + "response": [] + }, + { + "name": "list/service - filter parameters", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service?parameters=humidity", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ], + "query": [ + { + "key": "parameters", + "value": "humidity" + } + ] + } + }, + "response": [] + }, + { + "name": "list/service - filter chipset", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service?chipset=AMD 790FX", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ], + "query": [ + { + "key": "chipset", + "value": "AMD 790FX" + } + ] + } + }, + "response": [] + }, + { + "name": "list/service - filter mac", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service?mac=FF:FF:FF:FF:FF:FF", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ], + "query": [ + { + "key": "mac", + "value": "FF:FF:FF:FF:FF:FF" + } + ] + } + }, + "response": [] + }, + { + "name": "list/service - filter latest", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/service?latest=2", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "service" + ], + "query": [ + { + "key": "latest", + "value": "2" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Data", + "item": [ + { + "name": "data", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"clientTime\": 1000000000.1,\n \"time\": \"2018-09-21T17:42:12.587934\",\n \"tags\": [\n \"example-tag\"\n ],\n \"sensitive\": 1,\n \"chipset\": \"AMD 790FX\",\n \"mac\": \"FF:FF:FF:FF:FF:FF\",\n \"serviceNumber\": 3,\n \"value\": [\n \"20.2\",\n \"30.0\"\n ]\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/data", + "host": [ + "{{url}}" + ], + "path": [ + "data" + ] + } + }, + "response": [] + }, + { + "name": "list/data", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ] + } + }, + "response": [] + }, + { + "name": "list/data - filter sensitive", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data?sensitive=1", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ], + "query": [ + { + "key": "sensitive", + "value": "1" + } + ] + } + }, + "response": [] + }, + { + "name": "list/data - filter chipset", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data?chipset=AMD 790FX", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ], + "query": [ + { + "key": "chipset", + "value": "AMD 790FX" + } + ] + } + }, + "response": [] + }, + { + "name": "list/data - filter mac", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data?mac=FF:FF:FF:FF:FF:FF", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ], + "query": [ + { + "key": "mac", + "value": "FF:FF:FF:FF:FF:FF" + } + ] + } + }, + "response": [] + }, + { + "name": "list/data - filter serviceNumber", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data?serviceNumber=3", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ], + "query": [ + { + "key": "serviceNumber", + "value": "3" + } + ] + } + }, + "response": [] + }, + { + "name": "list/data - filter data", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/list/data?from=1995-09-07T10:40:52Z", + "host": [ + "{{url}}" + ], + "path": [ + "list", + "data" + ], + "query": [ + { + "key": "from", + "value": "1995-09-07T10:40:52Z" + } + ] + } + }, + "response": [] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "url", + "value": "http://dims.uiot.redes.unb.br", + "type": "string" + } + ] +} \ No newline at end of file