Navegando na Web com o Go/Golang

Após muito tempo trago mais um post sobre Go, confesso que a demora foi devido a o meu interesse atual pelo Dukescript, que me fez deixar de lado um pouco os estudos do Go. Mas decidi retomar aos poucos os estudos da linguagem revendo meu pequeno projeto de manipulação da API web do Steam.

HTTP em Go/Golang

Para usar a api do Steam precisei manipular chamadas HTTP e logo descobri que pode ser feito facilmente com a utilização do pacote net/http e net/url do Go.

import (
	"net/http"
  "net/url"
)

Com o import desses pacotes, já se pode utilizar as funções cliente do pacote:

resp, err := http.Get("http://teste.com/")

resp, err := http.Post("http://teste.com.br/upload", "image/jpeg", &buf)

resp, err := http.PostForm("http://teste.com.br/form",
	url.Values{"key": {"Value"}, "id": {"123"}})

Para o meu propósito coloquei uma função que trata o retorno de erro:

func perror(err error) {
	if err != nil {
		panic(err)
	}
}

Basicamente a função perror verifica se houve erro e chama a função panic para interromper a execução do programa. Então criei uma função que recebe o endereço http e retorna uma string com o conteúdo da resposta:

func navigateToString(address string) (response string) {
	_, err := url.Parse(address)
	perror(err)

	resp, err := http.Get(address)
	perror(err)

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)

	return string(body)
}

Como a função http.Get retorna o tipo Response que possui o elemento Body (que é um Reader), usei a função ReadAll do pacote utilitário io/ioutil para convertê-lo em um array de bytes e construir a string de retorno. Segue o código completo para testar a função:

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func perror(err error) {
	if err != nil {
		panic(err)
	}
}

func navigateToString(address string) (response string) {
	_, err := url.Parse(address)
	perror(err)

	resp, err := http.Get(address)
	perror(err)

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)

	return string(body)
}

func main() {
	fmt.Println(navigateToString("http://www.atarde.com.br"))
}

O código de webapiutils.go que criei se baseia na utilização do pacote net/url para obter a lista de métodos disponíveis na Steam Web API, no formato JSON, e possui funções que retornam a resposta como string, array de bytes ou como uma struct.

Em um futuro post mostrarei como manipular um objeto JSON no Go é fácil e como retornar uma struct que representa esse objeto.

Até mais!

Escrito em 13 Julho de 2015