Skip to main content

Command Palette

Search for a command to run...

Construindo um simples web server em Vlang

Tutorial com 3 maneiras fΓ‘ceis de desenvolver um servidor web em Vlang

Updated
β€’5 min read
Construindo um simples web server em Vlang
E

Linux power user since 2003. IT Manager, DevOps/SRE, Systems Administrator, and teacher. Bass player, Krav Maga practitioner, and sport shooter.

https://esli.blog || https://esli.cafe

Vamos subir um web server usando a linguagem V.

Caso nΓ£o conheΓ§a a Vlang, aqui tem um guia para aprender a programar em V:

As vantagens de utilizar V para a Web:

  • Uma linguagem segura, rΓ‘pida, com a agilidade de desenvolvimento de Python ou Ruby e o desempenho de C.

  • Zero dependΓͺncias: tudo o que Γ© necessΓ‘rio para o desenvolvimento web vem com a linguagem num pacote de 1 MB.

  • BinΓ‘rios muito pequenos: um site estΓ‘tico no tutorial do vweb tem cerca de 150 KB.

  • FΓ‘cil implementaΓ§Γ£o: um ΓΊnico arquivo binΓ‘rio inclui atΓ© os modelos prΓ©-compilados.

  • Funciona no hardware mais barato com um custo mΓ­nimo: para a maioria das aplicaΓ§Γ΅es, uma instΓ’ncia de 3 dΓ³lares Γ© suficiente.

  • Desenvolvimento rΓ‘pido, sem qualquer tipo de clichΓ©.

As maneiras de subir um web server usando V:

vweb

Com o V jΓ‘ instalado e testado (acesse o tutorial sobre como instalar o Vlang em https://esli.blog.br/introducao-a-linguagem-de-programacao-v-guia-completo#heading-instalando-e-atualizando-o-v )

Vamos criar o projeto:

v new site

Ele criarΓ‘ toda estrutura e jΓ‘ com o git local repo iniciado, basta apenas adicionar o remote server (origin) no git.

ls -lhtra site
drwxr-xr-x. 1 esli esli  12 jan 13 19:22 src
drwxr-xr-x. 1 esli esli   8 jan 13 19:22 ..
-rw-r--r--. 1 esli esli 107 jan 13 19:22 v.mod
-rw-r--r--. 1 esli esli 173 jan 13 19:22 .gitattributes
-rw-r--r--. 1 esli esli 123 jan 13 19:22 .editorconfig
drwxr-xr-x. 1 esli esli  98 jan 13 19:22 .git
-rw-r--r--. 1 esli esli 239 jan 13 19:22 .gitignore
git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .editorconfig
        .gitattributes
        .gitignore
        src/
        v.mod

nothing added to commit but untracked files present (use "git add" to track)

LΓ‘ em src/ crie o server.v

module main

import vweb

struct App {
    vweb.Context
}

fn main() {
    app := App{}
    vweb.run(app, 8080)
}

@['/index']
pub fn (mut app App) index() vweb.Result {
    return app.text('Hello world from vweb!')
}
//access the endpoint on http://localhost:8080/


fn (mut app App) test() vweb.Result {
    return app.text('Hello world test path from vweb!')
}
//access the endpoint on http://localhost:8080/test

fn (mut app App) page() vweb.Result {
    message := 'Hello, world from page Vweb!'
    return $vweb.html()
}
//access the endpoint on http://localhost:8080/page

Agora Γ© sΓ³ compilar e rodar!
Execute o comando:

v run src/server.v

v run src/server.v
[Vweb] Running app on http://localhost:8080/
[Vweb] We have 7 workers

E com ele em execuΓ§Γ£o, acesse: http://localhost:8080 e http://localhost:8080/test

Criei tambΓ©m um http://localhost:8080/page, na qual ele mostrarΓ‘ o conteΓΊdo de src/page.html no navegador.

Caso altere, precisarΓ‘ reiniciar a execuΓ§Γ£o. Para rodar no modo live-reload, e ter o update da web β€˜ao vivo’ (ou caso o conteΓΊdo nΓ£o seja estΓ‘tico), utilize o comando:

v watch run src/server.v

Pronto!
Rodamos um web server usando o vweb (descontinuado, mas ainda funcional), expondo um texto simples, dois paths e sendo um deles, uma pΓ‘gina web simples.

veb

Com o veb, foi criado, por exemplo, o tVeb, Tiniest Veb Server. Um Web Server completo usando a veb com um binΓ‘rio completo em menos de 1Mb focado em arquivos estΓ‘ticos.

Mesmo assim, vamos subir um simples web server com a lib veb:

Crie o src/server-veb.v

module main

import veb

pub struct Context {
    veb.Context
}

pub struct App {}

pub fn (app &App) index(mut ctx Context) veb.Result {
    return ctx.text('Hello, World from veb!')
}

fn main() {
    mut app := &App{}
    veb.run[App, Context](mut app, 8181)
}

E para rodar em live reload, use o comando: v -d veb_livereload watch run src/server-veb.v

Pronto!

A documentaΓ§Γ£o completa do veb: https://modules.vlang.io/veb.html

picoev

O picoev Γ© uma implementaΓ§Γ£o V do picoev feito em C, que Γ© "Um pequeno e rΓ‘pido loop de eventos para aplicaΓ§Γ΅es de rede".

A documentaΓ§Γ£o do picoenv: https://modules.vlang.io/picoev.html

import json
import picoev
import picohttpparser

const port = 8282

struct Message {
    message string
}

@[inline]
fn json_response() string {
    msg := Message{
        message: 'Hello, World from pico!'
    }
    return json.encode(msg)
}

@[inline]
fn hello_response() string {
    return 'Hello, World from pico!'
}

fn callback(data voidptr, req picohttpparser.Request, mut res picohttpparser.Response) {
    if req.method == 'GET' {
        if req.path == '/t' {
            res.http_ok()
            res.header_server()
            res.header_date()
            res.plain()
            res.body(hello_response())
        } else if req.path == '/j' {
            res.http_ok()
            res.header_server()
            res.header_date()
            res.json()
            res.body(json_response())
        } else {
            res.http_ok()
            res.header_server()
            res.header_date()
            res.html()
            res.body('Hello, World from pico!\n')
        }
    } else {
        res.http_405()
    }
    res.end()
}

fn main() {
    println('Starting webserver on http://localhost:${port}/ ...')
    mut server := picoev.new(port: port, cb: callback)!
    server.serve()
}

Novamente, sΓ³ executar o comando: v watch run src/server-pico.v

ConclusΓ£o

Criamos 3 web servers:

http://localhost:8080, http://localhost:8080/test e http://localhost:8080/page - usando vweb

http://localhost:8181 - usando veb

http://localhost:8282 - usando picoenv

O cΓ³digo destes testes estΓ£o em https://github.com/Esl1h/static-v-site e https://gitlab.com/Esl1h/static-v-site

Em todos eles, a questΓ£o do TLS/SSL pode ser resolvida com proxy reverso usando NGINX ou Caddy.

Faltou explorarmos o framework Vex e tambΓ©m criar algo com a lib net.http (que nΓ£o mencionei anteriormente e sua doc estΓ‘ em https://modules.vlang.io/net.http.html).

FicarΓ‘ para um prΓ³ximo post.

Tech

Part 37 of 50

Technical topics. Code, Linux, Network... Exercising the Tech Writer and teacher in me. Articles covering topics from across the entire OSI layer. Artigos passando por assuntos de toda a camada OSI.

Up next

TΓ©cnicas para Lidar com erros em Vlang Utilizando os.system e Operador or

Erros em Vlang: uso de os.system e operador or para soluΓ§Γ΅es