Tenho trabalhado com um background de geolocalização com uma aplicação Ionic. Tem um plugin bem bacana para fazer isso. A versão gratuita do plugin é ok, mas na versão premium você tem várias melhorias, especialmente no consumo de bateria de dispositivos Android.
Basicamente o plugin faz uma requisição POST para o servidor com o dado do GPS. Quando eu estava desenvolvendo minha aplicação, precisava de um simples servidor HTTP para ver as requisições POST. Depois, eu faria o código do backend para manipular as requisições. Eu posso desenvolver uma simples aplicação Silex com uma rota POST e fazer o log da requisição em um arquivo, ou fazer um flush das requisições para o console. Isso teria sido simples, mas como eu sou um grande fã de websockets (sim, eu tenho que admitir que eu quero usar websockets em todo lugar!) eu tive uma ideia: criar um simples servidor HTTP para manipular minhas requisições POST GPS, mas, em vez de fazer o log na requisição, eu emitiria um websocket. Então, eu posso criar um site que se conecta ao servidor websocket e registrar na tela a requisição POST. Ok, hoje eu estou meio devagar para lutar com o frontend, então meu log será no console do browser.
Para construir a aplicação, eu vou reutilizar um dos meus projetos no GitHub: PHP dumper. A ideia é quase a mesma. Vou criar um servidor HTTP simples com Silex com duas rotas, uma para lidar com requisições POST (as do GPS) e outra para o GET, para me permitir conectar ao websocket.
Esse é o servidor. Silex, um pouco de Twig, um pouco também de Guzzle, e é isto:
use GuzzleHttp\Client;
use Silex\Application;
use Silex\Provider\TwigServiceProvider;
use Symfony\Component\HttpFoundation\Request;
$app = new Application([
'debug' => true,
'ioServer' => '//localhost:8888',
'wsConnector' => 'http://127.0.0.1:26300'
]);
$app->register(new TwigServiceProvider(), [
'twig.path' => __DIR__ . '/../views',
]);
$app['http.client'] = new Client();
$app->get("/{channel}", function (Application $app, $channel) {
return $app['twig']->render('index.twig', [
'channel' => $channel,
'ioServer' => $app['ioServer']
]);
});
$app->post("/{channel}", function (Application $app, $channel, Request $request) {
$app['http.client']->get($app['wsConnector'] . "/info/{$channel}/" . json_encode($request->getContent()));
return $app->json('OK');
});
$app->run();
Esse é o template Twig. Nada de especial: um pouco de Bootstrap e um cliente socket.io. Cada vez que o usuário acessa a url de um “canal” (GET/mychannel), ele faz a conexão com o servidor websocket.
var CONF = {
IO: {HOST: '0.0.0.0', PORT: 8888},
EXPRESS: {HOST: '0.0.0.0', PORT: 26300}
},
express = require('express'),
expressApp = express(),
server = require('http').Server(expressApp),
io = require('socket.io')(server, {origins: 'localhost:*'})
;
expressApp.get('/:type/:session/:message', function (req, res) {
console.log(req.params);
var session = req.params.session,
type = req.params.type,
message = req.params.message;
io.sockets.emit('dumper.' + session, {title: type, data: JSON.parse(message)});
res.json('OK');
});
io.sockets.on('connection', function (socket) {
console.log("Socket connected!");
});
expressApp.listen(CONF.EXPRESS.PORT, CONF.EXPRESS.HOST, function () {
console.log('Express started');
});
server.listen(CONF.IO.PORT, CONF.IO.HOST, function () {
console.log('IO started');
});
Cada vez que o plugin de geolocalização enviar o POST com dados de GPS, o roteador de POST do Silex irá emitir o WebSocket para o canal desejado. Nosso cliente Websocket apenas irá locar os dados GPS utilizando console.log. É difícil explicar, mas é um procedimento bastante simples.
Também é possível emular as requisições POST com este simples script node:
var request = require('request');
request.post('http://localhost:8080/Hello', {form: {key: 'value'}}, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
});
E é isso. Você pode ver o código completo no meu GitHub.
***
Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://gonzalo123.com/2015/11/16/post-request-logger-using-websockets/




