> For the complete documentation index, see [llms.txt](https://davidwinalda94.gitbook.io/mastering-golang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://davidwinalda94.gitbook.io/mastering-golang/go-basic-for-web-development/query-string.md).

# Query String

Untuk membuat routing dengan model query string, kita akan membuat 1 buah routing lagi yaitu `/product` yang nantinya akan kita akses dengan bentuk `/product?id=1` . Parameter dari query string yang kita buat adalah `id` dan value bertipe `int` .

Kita akan mendaftarkan routing menggunakan `http.handleFunc` :

```go
http.HandleFunc("/product", handlerProduct)
```

Selanjutnya kita akan membuat fungsi handler bernama `handlerProduct` :

```go
func handlerProduct(w http.ResponseWriter, r *http.Request) {
	id := r.URL.Query().Get("id")
	idNumber, err := strconv.Atoi(id)

	if err != nil && idNumber < 1 {
		http.NotFound(w, r)
		return
	}

	fmt.Fprintf(w, "Product page: %d", idNumber)
}
```

Pada kode di atas, kita mendaftarkan parameter `id` menggunakan fungsi dari parameter `r` :

```go
id := r.URL.Query().Get("id")
```

Kita memerlukan convert nilai `string` ke dalam `int` karena URL atau routing pastinya merupakan tipe data `string` . Untuk itu `id` yang diakses melalui query string akan diconvert menggunakan fungsi dari [package](https://golang.org/pkg/strconv/) `strconv` :

```go
idNumber, err := strconv.Atoi(id)
```

Lalu kita akan membuat kondisi jika ada error dan `id` yang dimasukkan nilainya kurang dari `1` maka kita akan mengembalikan respon menggunakan fungsi `http.NotFound` .

```go
	if err != nil && idNumber < 1 {
		http.NotFound(w, r)
		return
	}
```

Untuk menampilkan teks pada halaman website, kita tidak bisa menggunakan `w.Write` tetapi dapat menggunakan fungsi lain yaitu `fmt.Fprintf` :

```go
fmt.Fprintf(w, "Product page: %d", idNumber)
```

Kode lengkapnya dapat dilihat di bawah ini:

```go
package main

import (
	"fmt"
	"log"
	"net/http"
	"strconv"
)

func handlerIndex(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}

	data := "Welcome to Web Applications written by GO"
	w.Write([]byte(data))
}

func handlerAuthor(w http.ResponseWriter, r *http.Request) {
	data := "David Winalda"
	w.Write([]byte(data))
}

func handlerProduct(w http.ResponseWriter, r *http.Request) {
	id := r.URL.Query().Get("id")
	idNumber, err := strconv.Atoi(id)

	if err != nil && idNumber < 1 {
		http.NotFound(w, r)
		return
	}

	fmt.Fprintf(w, "Product page: %d", idNumber)
}

func main() {
	http.HandleFunc("/", handlerIndex)
	http.HandleFunc("/author", handlerAuthor)
	http.HandleFunc("/product", handlerProduct)

	port := "localhost:3030"

	log.Println("Server started at", port)

	err := http.ListenAndServe(port, nil)

	if err != nil {
		fmt.Println(err.Error())
	}
}
```

Sekarang kita coba jalankan program dan mengakses routing query string.

![Menampilkan data yang didapat dari query string](/files/-MTBW0figtXqMuW2_Ugv)
