Slide 56 de 74

Requisições HTTP e query strings

Uma requisição
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}"
	}
}
Query strings
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.
  • Um campo ausente é erro a menos que tenha um 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.
  • Uma query string é plana, então só um tipo sem variantes cujos campos são valores, ou vetores de valores, viaja como uma — qualquer outra coisa é erro de compilação na chamada.