proc main(): void {
request := hive.net.HttpRequest("GET", "https://example.com/", [], "")
answer := hive.net.httpRequest(request)
if answer is Result.Ok(response) {
echo "status {response.status}, {len(response.body)} caracteres"
} else if answer is Result.Error(why) {
echo "sem resposta de {why.url}: {why.message}"
}
}type Search {
term: Str -- URL as q;
page: Int -- Default as 1;
tags: Str[dyn] -- URL as tag;
}
proc main(): void {
echo hive.net.urlEncode("rust & go")
params := encode(Search("rust & go", 2, ["web", "cli"]), hive.net.queryParamsCodec())
echo "https://example.com/search?{params}"
if Search.decode("q=hive+lang&tag=web", hive.net.queryParamsCodec()) is Result.Ok(s) {
echo "{s.term}, página {s.page}"
}
}hive.net.httpRequest(request) envia um HttpRequest(method, url, headers, body) e responde com um Result<HttpResponse, hive.net.HttpError>. Qualquer resposta é Ok — um 404 e um 500 incluídos, com seu status — e um HttpError, com a url e uma message, é para quando não chega resposta: uma URL ruim, uma conexão recusada, ou nada em 30 segundos.
urlEncode(text) codifica em porcentagem todo byte exceto letras, dígitos e - . _ ~, então o que volta é seguro tanto num caminho quanto numa query. queryParamsCodec() é um codec para a própria query string, sem o ?: encode escreve os campos de um tipo como pares chave=valor, e T.decode os lê de volta.
-- URL as <chave>; nomeia um parâmetro, e um vetor é a sua chave repetida: tag=web&tag=cli. Um T[3] precisa da chave exatamente três vezes.+ e %20 são ambos um espaço, um ? no começo é aceito, e uma chave que o tipo não declara é ignorada.Default, e uma chave dada duas vezes para algo que não é vetor é erro. Um Bool é escrito true ou false; uma chave sozinha não é um.