สร้างแบบฟอร์ม อินพุต

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 ในที่ต่างๆ

Leave a Reply

Your email address will not be published. Required fields are marked *