# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://davidwinalda94.gitbook.io/mastering-golang/go-basic-for-web-development/query-string.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
