DEV Community

TekniksMila
TekniksMila

Posted on

Building a URL Shortener in Go: A Step-by-Step Guide

Introduction

A server is a specialized system whose role is to respond to requests made by computers over a network. Servers are very critical since they provide hosting for websites and applications, and they also facilitate communication over a network. In this article, let's dive into creating a simple HTTP server that serves files and handles form submissions and requests to specific endpoints.
Prerequisites

Basic understanding of Go and web development concepts.

Must have Go installed. If you do not have Go installed, first navigate here https://go.dev/doc/manage-install to install Go.

Project directory structure

Open terminal.

Create a directory with the name 'WebServer'.

Navigate into the 'WebServer' directory.

Initialize a new Go module.

Create a file with the name 'main.go'.

Create a new directory inside the 'WebServer' directory and name it 'files'.

Navigate into the files directory.

Create two files with the names index.html and form.html.

 mkdir WebServer
 cd WebServer
 go mod init example/WebServer
 touch main.go
 mkdir files
 cd files
 touch index.html
 touch form.html

The code

Open the index.html file and write the code as shown below. This will display a static web page.

static website



static website



Open the form.html file and write the code as shown below: When rendered, this will display a form with name and address text fields.

<!DOCTYPE html>







Name
Address
          <input type="submit" value="submit"/>
          </form>
      </div>
  </body>

Open main.go. Here we start off by declaring the main package, then import the packages that are necessary for the working of our program.

  package main

  import (
      "fmt"
      "log"      // Importing the log package for logging
      "net/http" // Importing the net/http package for HTTP server functionality
  )

Next we create a function that handles form submissions.

func formHandler(w http.ResponseWriter, r *http.Request) {
// ParseForm parses the raw query from the URL and updates r.Form
if err := r.ParseForm(); err != nil {
fmt.Fprintf(w, "ParseForm() err: %v", err)
return
}
fmt.Fprintf(w, "POST request successful")
name := r.FormValue("name") // Retrieve the value of the 'name' parameter from the form
address := r.FormValue("address") // Retrieve the value of the 'address' parameter from the form
fmt.Fprintf(w, "Name = %s\n", name) // Print the name to the response writer
fmt.Fprintf(w, "Address = %s\n", address) // Print the address to the response writer
}

Create a function that handles requests to the /hello endpoint.

func helloHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/hello" {
http.Error(w, "404 not found", http.StatusNotFound)
return
}
if r.Method != "GET" {
http.Error(w, "method is not supported", http.StatusNotFound)
return
}
fmt.Fprintf(w, "hello!") // Respond with "hello!" for GET requests to /hello endpoint
}

Create a main function that defines a simple HTTP server that serves static files from the ./files directory and handles requests to specific endpoints (/form and /hello) with custom handler functions.

func main() {
fileServer := http.FileServer(http.Dir("./files"))
// Create a file server handler for serving static files from ./files directory
http.Handle("/", fileServer) // Handle requests to root path with fileServer handler
http.HandleFunc("/form", formHandler) // Handle requests to /form endpoint with formHandler function
http.HandleFunc("/hello", helloHandler) // Handle requests to /hello endpoint with helloHandler function

fmt.Printf("Starting server at port 8080\n")

if err := http.ListenAndServe(":8080", nil); err != nil {
    log.Fatal(err) // Log any errors that occur during server startup and exit with error status
}

}

Executing the program

Save the files you have created.

On the terminal type the following command:

go run main.go

When you see "Starting server at port 8080" displayed on the terminal, head over to your browser and search "localhost:8080".

Open new tab on your browser and search "localhost:8080/form.html".

A form as the one shown below will be displayed.

Upon submitting the form after filling in the name and address field, the following message is displayed.

This shows that our web server is working as expected.

Resources

Find the code in my GitHub repository. Here is the link

https://github.com/JosephOkumu/WebServer

Top comments (0)