Networking and HTTP

34.1 HTTP Client

import net.http
import json

fn main() {
	resp := http.get('https://api.github.com/repos/vlang/v') or { panic(err) }
	println(resp.status_code)
	println(resp.body.len)

	data := http.post_json('https://httpbin.org/post', json.encode({'a': 1})) or { panic(err) }
	println(data.body)

	mut req := http.new_request(.get, 'https://example.com', '')
	req.add_header(.user_agent, 'v-client')
	req.add_custom_header('X-Token', 'abc') or {}
	r := req.do() or { panic(err) }
	println(r.header.get(.content_type) or { '' })

	http.download_file('https://example.com/file.zip', 'file.zip') or {}
	text := http.fetch(url: 'https://example.com', method: .get) or { panic(err) }
	_ = text
}

34.2 Simple HTTP Server

import net.http

struct Handler {}

fn (h Handler) handle(req http.Request) http.Response {
	mut res := http.Response{
		body: 'Hello from ${req.url}'
	}
	res.set_status(.ok)
	return res
}

fn main() {
	mut server := http.Server{
		addr: ':8080'
		handler: Handler{}
	}
	server.listen_and_serve()
}

34.3 TCP, UDP, WebSockets

Also: net.smtp (send email), net.urllib (URL parsing), net.html (HTML parsing), net.ftp, TLS via net.mbedtls (bundled) or net.openssl.

import net
// TCP server
mut l := net.listen_tcp(.ip, ':9000') or { panic(err) }
for {
	mut conn := l.accept() or { continue }
	spawn fn (mut c net.TcpConn) {
		defer { c.close() or {} }
		mut buf := []u8{len: 1024}
		n := c.read(mut buf) or { return }
		c.write(buf[..n]) or {}
	}(mut conn)
}
// TCP client: net.dial_tcp('localhost:9000')!
// UDP: net.listen_udp(':9001'), net.dial_udp('host:port')
// WebSocket: import net.websocket; websocket.new_client('wss://...')