#Making HTTP requests in Go
Welcome Gophers! In this tutorial, we are going to be taking a quick look at how we can make HTTP requests in Go!
In Go, we can use the net/http package in order to help us make our own HTTP requests.
Importing the Package
To use the net/http package in your Go program, you will need to import it first:
import "net/http"
Making a GET Request
The most basic type of HTTP request is a GET request. To make a GET request, you can use the http.Get function like so:
resp, err := http.Get("http://www.example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
The http.Get function sends a GET request to the specified URL and returns a response object and an error. If there was an error making the request, the error will be non-nil.
The response object has a number of fields, including the status code, headers, and the response body. You can read the response body using the io.Reader interface:
body, err := io.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
The io.ReadAll function reads the entire response body into a byte slice. You can then convert the byte slice to a string and print it out.
Making a POST Request
Now that we’ve mastered the GET request, let’s take a look at other types of requests that we could be making.
To make a POST request, you can use the http.Post function:
resp, err := http.Post("http://www.example.com/post", "application/x-www-form-urlencoded", strings.NewReader("name=value"))
if err != nil {
// handle error
}
defer resp.Body.Close()
The http.Post function takes three arguments: the URL, the content type of the request body, and the request body itself. In this example, we are sending a POST request with a form-encoded body.
Customizing the Request
To customize the HTTP request further, you can use the http.NewRequest function to create an *http.Request object:
req, err := http.NewRequest("GET", "http://www.example.com/", nil)
if err != nil {
// handle error
}
req.Header.Set("User-Agent", "MyUserAgent/1.0")
The http.NewRequest function takes three arguments: the HTTP method, the URL, and the request body. In this example, we are creating a GET request with no request body.
You can then set headers on the request using the Header field of the *http.Request object. In this example, we are setting the User-Agent header.
To send the request, you can use the http.DefaultClient.Do function:
resp, err := http.DefaultClient.Do(req)
if err != nil {
// handle error
}
defer resp.Body.Close()
The http.DefaultClient.Do function sends the request and returns a response.
That’s it! You now know how to make HTTP requests in Go.
Further Reading
To deepen your understanding of HTTP handling in Go, consider exploring parsing JSON responses which is commonly used when processing API responses. You might also find creating a simple web server useful for building the server side of HTTP communication, or check out creating a RESTful API for a complete picture of both client and server HTTP interactions.
Continue Learning
An Introduction to Testing in Go
In this tutorial, we look at how to properly implement tests within your Go based systems using the go test tool
The Complete Guide to Testing in Go
Master Go testing with comprehensive coverage of unit tests, benchmarking, mocking, integration tests, and fuzzing in Go 1.26+
Supercharge Your Go Tests Using Fake HTTP Services
Learn how to write reliable tests in Go by using fake HTTP services. This tutorial covers examples with httptest and the fakes library.
Beginner's Guide to Logging in Tests in Golang
In this tutorial, we're going to be looking at how we can improve our test output readability using the inbuilt helper methods in the testing package!