สร้างแบบฟอร์ม อินพุต
HTML Forms คือการสร้างฟอร์มใน html โดยฟอร์มที่ได้จะถูกใช้ในการส่งข้อมูลไปยังเซิฟเวอร์ แท็กที่ใช้ในการสร้างฟอร์มคือ แท็ก <form> ฟอร์มประกอบด้วยแท็ก input เช่น กรอบข้อความ (text fields), ปุ่มต่าง ๆ เป็นต้น
การทำงานของ HTML Form จะเริ่มต้นโดย การรับ input จากผู้เข้าชมเว็บไซต์ แล้วจะส่งข้อมูลเหล่านั้น ไปที่เซิฟเวอร์ แล้วทำการประมวลผลต่อไป ส่วนการประมาลผลจะเป็นแบบใดนั้น ก็อยู่ที่เรากำหนดมัน องค์ประกอบของ Form ใน HTML นั้น อาจจะประกอบไปด้วย ช่องกรอบช้อความ ตัวเลือกต่าง ๆ เพื่อใช้ในการรับข้อมูลจากผู้ใช้
ข้อกำหนดเบื้องต้น
ข้อกำหนดสำหรับบทความนี้คือ คุณต้องติดตั้ง Go บนคอมพิวเตอร์ของคุณและเคยเรียนรู้บทความ สร้าง Web Server อย่างง่าย มาก่อน
สร้าง Template
Template คือ ? ไฟล์ที่ถูกตั้งค่าเพื่อเป็นแพทเทิร์น (Pattern) สำหรับใช้กับการสร้างไฟล์งานตามความต้องการ
สร้างไฟล์ Template ชื่อ login.gtpl เขียนโค้ดดังนี้
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
Username:<input type="text" name="username">
Password:<input type="password" name="password">
<input type="submit" value="Login">
</form>
</body>
</html>
แบบฟอร์มนี้จะถูกส่ง /login ไปยังเซิร์ฟเวอร์ หลังจากที่ผู้ใช้คลิกปุ่มเข้าสู่ระบบ ข้อมูลจะถูกส่งไปยัง login ตัวจัดการที่ลงทะเบียนโดยเราเตอร์เซิร์ฟเวอร์ จากนั้นเราต้องการรู้ว่ามันใช้วิธี POST หรือ GET
ง่ายต่อการค้นหาโดยใช้แพ็คเกจ http มาดูวิธีจัดการข้อมูลแบบฟอร์มในหน้าเข้าสู่ระบบกัน
ไปที่ ไฟล์ main.go เขียนโค้ดดังนี้
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"strings"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //Parse url parameters passed, then parse the response packet for the POST body (request body)
// attention: If you do not call ParseForm method, the following data can not be obtained form
fmt.Println(r.Form) // print information on server side.
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") // write data to response
}
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //get request method
if r.Method == "GET" {
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, nil)
} else {
r.ParseForm()
// logic part of log in
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
}
}
func main() {
http.HandleFunc("/", sayhelloName) // setting router rule
http.HandleFunc("/login", login)
err := http.ListenAndServe(":9090", nil) // setting listening port
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
คอมไพล์ไฟล์ซอร์สโค้ดด้วยคำสั่ง go build
เรียกใช้งาน โดยใช้คำสั่ง ./web
ที่นี่เราใช้ r.Method เพื่อรับวิธีการร้องขอและส่งคืนกริยา http -“GET”, “POST”, “PUT” เป็นต้น
ในฟังก์ชันการเข้าสู่ระบบ เราใช้ r.Method เพื่อตรวจสอบว่าหน้าเข้าสู่ระบบหรือตรรกะการประมวลผลการเข้าสู่ระบบ กล่าวอีกนัยหนึ่ง เราตรวจสอบเพื่อดูว่าผู้ใช้เพียงแค่เปิดหน้าหรือพยายามเข้าสู่ระบบ ให้บริการแสดงหน้าเฉพาะเมื่อมีคำขอเข้ามาผ่านวิธี GET และจะดำเนินการตรรกะการเข้าสู่ระบบเมื่อคำขอใช้กระบวนการ POST .
เปิดเว็บบราวเซอร์ ป้อน URL http://localhost:9090/login คุณจะเห็นว่า กรอบข้อความ Username และ Password พร้อมปุ่ม Login อยู่บนหน้าจอของคุณ
เซิร์ฟเวอร์จะไม่พิมพ์อะไรจนกว่าเราจะพิมพ์ชื่อผู้ใช้และรหัสผ่าน เนื่องจากตัวจัดการจะไม่แยกวิเคราะห์แบบฟอร์มจนกว่าเราจะเรียก r.ParseForm() มาเพิ่ม r.ParseForm() ก่อน fmt.Println(“username:”, r.Form[“username”])
ทดสอบ ใส่ Username และ Password แล้วกดปุ่ม Login
คุณจะพบว่าข้อมูลถูกพิมพ์บนฝั่งเซิร์ฟเวอร์ในขณะนี้
r.Form มีอาร์กิวเมนต์คำขอทั้งหมด เช่น สตริงการสืบค้นใน URL และข้อมูลใน POST และ PUT หากข้อมูลมีความขัดแย้ง เช่น พารามิเตอร์ที่มีชื่อเดียวกัน เซิร์ฟเวอร์จะบันทึกข้อมูลลงในสไลซ์ที่มีค่าหลายค่า เอกสาร Go ระบุว่า Go จะบันทึกข้อมูลจากคำขอ GET และ POST ในที่ต่างๆ