Go > Web Development > REST APIs > Returning JSON responses
Simple JSON Response in Go
This snippet demonstrates how to create a basic REST API endpoint in Go that returns a JSON response. It's a fundamental example for understanding how to serialize Go data structures into JSON format for web APIs.
Setting up the Go project
First, ensure you have Go installed and your GOPATH configured. Create a new directory for your project and initialize a module using `go mod init
go mod init example.com/hello
Defining the Data Structure
We define a struct to represent the data we want to return as JSON. The `json:` tags are crucial; they tell the `json` package how to map the struct fields to JSON keys.
package main
import (
"encoding/json"
"log"
"net/http"
)
type Response struct {
Message string `json:"message"`
Status int `json:"status"`
}
Creating the Handler Function
The handler function is where the logic resides for creating the JSON response. We create an instance of our `Response` struct, populate it with data, and then use `json.NewEncoder` to serialize it into JSON and write it to the `http.ResponseWriter`.
func handleRequest(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
response := Response{Message: "Hello from Go!", Status: http.StatusOK}
err := json.NewEncoder(w).Encode(response)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
Setting up the Server
Finally, we set up the HTTP server, register our handler function to a specific route, and start listening for incoming requests.
func main() {
http.HandleFunc("/", handleRequest)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Complete Code Example
This is the entire code required to run the basic endpoint. Save it to `main.go` and run it using `go run main.go`. Accessing the endpoint in a web browser or using curl will show the json output.
package main
import (
"encoding/json"
"log"
"net/http"
)
type Response struct {
Message string `json:"message"`
Status int `json:"status"`
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
response := Response{Message: "Hello from Go!", Status: http.StatusOK}
err := json.NewEncoder(w).Encode(response)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func main() {
http.HandleFunc("/", handleRequest)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Running the Application
Save the code as `main.go` and execute `go run main.go`. Then, open your web browser or use `curl` to access the endpoint at `http://localhost:8080/`. You should see the JSON response.
go run main.go
curl http://localhost:8080/
Concepts Behind the Snippet
This snippet utilizes several core Go concepts:
Real-Life Use Case
This pattern is the foundation for building any REST API endpoint. Imagine a service that retrieves user data from a database. You would define a struct representing the user, fetch the data from the database, populate the struct, and then serialize it to JSON to send back to the client.
Best Practices
Interview Tip
Be prepared to explain how JSON serialization works in Go, including the role of struct tags. Also, understand the importance of setting the `Content-Type` header and handling errors gracefully.
When to Use Them
Use this pattern when you need to create APIs that communicate data in JSON format, which is a standard for web applications.
Memory Footprint
The memory footprint depends on the size of the data being serialized. For small responses like in this example, the memory usage is minimal. For larger responses, consider using streaming techniques to reduce memory consumption.
Alternatives
Pros
Cons
FAQ
-
What does `json:"message"` mean in the struct definition?
This is a struct tag that tells the `encoding/json` package to map the `Message` field to the JSON key "message" when serializing the struct to JSON. -
Why do I need to set the `Content-Type` header?
Setting the `Content-Type` header to `application/json` tells the client that the response is in JSON format. This allows the client to correctly parse and interpret the data. -
How do I handle errors when encoding JSON?
The `json.NewEncoder(w).Encode(response)` function returns an error if something goes wrong during the encoding process. You should always check for this error and handle it appropriately, for example, by returning an HTTP error code and logging the error.