Hello World

เกี่ยวกับบทเรียน

ภาษา Go เป็นภาษาที่มีมาพร้อมกับสิ่งอำนวยความสะดวกที่จำเป็นสำหรับการใช้งาน และมีเว็บเซิร์ฟเวอร์ในตัวพร้อมสำหรับการใช้งาน แพ็กเกจ net/http ซึ่งมีอยู่ในสแตนดาร์ดไลบรารีมีฟังก์ชันการทำงานที่เพียบพร้อมสำหรับ HTTP โพรโทคอล และอื่นๆอีกมากมาย ทั้งในส่วนของ HTTP client และ HTTP server ตัวอย่างที่เรามีให้จะทำให้คุณเห็นภาพว่ามันง่ายขนาดไหน ที่เราจะทำการสร้างเว็บเซิร์ฟเวอร์ที่จะทำให้คุณสามารถที่จะเปิดดูได้จากเบราว์เซอร์ของคุณ

การจัดการ Request

ขั้นแรก เราจะทำการสร้าง Handler ซึ่งทำหน้าที่รับข้อมูล HTTP ที่ถูกส่งเข้ามาทั้งหมดจากเบราว์เซอร์ ไม่ว่าจะมาจาก HTTP client หรือ API

Handler ในภาษา Go เราสามารถเขียนเป็นฟังก์ชันได้ตามตัวอย่างทางด้านล่าง

func (w http.ResponseWriter, r *http.Request)
จากฟังก์ชันจะมีการรับค่า:

  1. http.ResponseWriter ซึ่งเป็นส่วนที่เราจะใช้เพื่อเขียนข้อมูล text/html ก่อนที่จะค่าส่งกลับไป
  2. http.Request เป็นส่วนเก็บข้อมูลจาก HTTP request ทั้งหมดเมื่อมีการเรียกเข้ามาซึ่งจะประกอบไปด้วย ข้อมูล URL และข้อมูล header ทั้งหมด

การสร้าง Request Handler จากฝั่ง Server ก็สามารถสร้างได้ง่ายๆ ดังนี้:

http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
})

การเชื่อมต่อ HTTP

ตัว Request Handler โดดๆ ไม่สามารถที่จะรับค่าจาก HTTP ได้เพราะ HTTP server ต้องรอรับข้อมูลจากพอร์ตสำหรับการเชื่อมต่อและรอรับข้อมูลเมื่อมีรีเควสต์เข้ามา พอร์ต 80 เป็นพอร์ตยอดนิยมและมักจะเป็นค่าเริ่มต้นสำหรับการรับส่งข้อมูล HTTP ดังนั้นเซิร์ฟเวอร์ที่พวกเราจะทำการสร้างก็จะรับข้อมูลโดยพอร์ตนี้ด้วยเช่นเดียวกัน

โค้ดต่อไปนี้มีหน้าที่สั่งให้เริ่มต้นใช้งาน HTTP server และรอรับข้อมูลจากเชื่อมต่อผ่านพอร์ต 80 คุณสามารถเปิดเบราว์เซอร์และเชื่อมต่อด้วยการพิมพ์ที่อยู่ http://localhost/ เพื่อดูว่าเซิร์ฟเวอร์ที่เราเพิ่งสร้างจะแสดงผลอย่างไร

http.ListenAndServe(":80", nil)

โค้ด (สำหรับทดสอบ copy/paste)

นี่เป็นตัวโค้ดที่เสร็จสมบูรณ์ ซึ่งคุณสามารถนำไปใช้ทดสอบได้ เป็นโค้ดที่คุณได้เรียนรู้มาทั้งหมดในบทเรียนบทนี้

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
	})

	http.ListenAndServe(":80", nil)
}