URL phức tạp hơn nhiều người vẫn nghĩ. Xử lý các trường hợp và bảo mật ứng dụng bằng tính năng xử lý URL có sẵn của Go sẽ khiến mọi thứ trở nên đơn giản hơn.
URLs (Uniform Resource Locators) là một trong số những phần cơ sở hạ tầng Internet quan trọng nhất. Khi xây dựng ứng dụng web, bạn cần tinh chỉnh URL để định vị và truy xuất tài nguyên.
Khi xây dựng các ứng dụng web phức tạp hơn, bạn cần làm việc với URL ở cấp độ chi tiết hơn. Bạn có thể cần xác định bảng màu, tên máy chủ, đường dẫn và các tham số truy vấn. Bạn cũng cần biết cách mã hóa và giải mã URL để có thể xử lý các ký tự đặc biệt và giữ an toàn cho ứng dụng web.
Thư viện chuẩn của Go cung cấp gói net/url để xử lý các thành phần URL.
Gói URL
Gói url cung cấp các hàm và tính năng toàn diện để người dùng làm việc với URL và các phần riêng biệt của chúng. Nó cung cấp chức năng phân tích, xây dựng, mã hóa và giải mã URL, khiến gói này trở nên hữu ích trong việc phát triển web.
Một số tính năng chính của gói url là phân tích cú pháp URL thành các thành phần riêng lẻ để thao tác và xây dựng URL cho các truy vấn HTTP. Gói url cũng cung cấp cấu trúc URL cùng một phương thức Parse để phân tích chuỗi thành URL.
Đây là mẫu cấu trúc url.URL:
package main
type URL struct {
// Scheme is the protocol scheme of the URL,
// such as "http" or "https"
Scheme string
// Opaque is used to hold any opaque data
// that should be encoded in the URL
Opaque string
// User holds information about the user making the request,
// such as a username and password
User *Userinfo
// Host is the hostname or IP address
// of the server hosting the URL
Host string
// Path is the path of the URL on the server
Path string
// RawPath is the original,
// encoded path of the URL
RawPath string
// ForceQuery indicates whether the URL should include a query string
// even if it is empty
ForceQuery bool
// RawQuery is the original,
//encoded query string of the URL
RawQuery string
// Fragment is the fragment identifier of the URL,
// used for linking to a specific element on a page
Fragment string
// RawFragment is the original,
// encoded fragment identifier of the URL
RawFragment string
}
Biết cách truy cập các phần khác nhau trong cấu trúc URL có thể hữu ích cho những tác vụ như xác thực.
Phân tích URL bằng hàm Parse
Hàm Parse của gói url cung cấp chức năng phân tích chuỗi URL thành những nhân tố riêng lẻ. Hàm Parse lấy duy nhất một URL làm đối số và trả về một con trỏ dẫn tới struct url.URL chứa dữ liệu được phân tích của URL và một kiểu lỗi.
Đây là cách bạn có thể dùng hàm Parse để truy xuất các thành phần của một URL.
import (
"fmt"
"net/url"
)
func main() {
// The URL you want to parse
exampleURL := "https://www.example.com/path?param1=value1¶m2=value2"
// Parse the URL
parsedURL, err := url.Parse(exampleURL)
if err != nil {
fmt.Println(err)
return
}
// Print all the fields of the URL
fmt.Println("Scheme:", parsedURL.Scheme)
fmt.Println("Opaque:", parsedURL.Opaque)
fmt.Println("User:", parsedURL.User)
fmt.Println("Host:", parsedURL.Host)
fmt.Println("Path:", parsedURL.Path)
fmt.Println("RawPath:", parsedURL.RawPath)
fmt.Println("ForceQuery:", parsedURL.ForceQuery)
fmt.Println("RawQuery:", parsedURL.RawQuery)
fmt.Println("Fragment:", parsedURL.Fragment)
fmt.Println("RawFragment:", parsedURL.RawFragment)
}
Biến exampleURL chứa URL đầy đủ, chưa được phân tích. Hàm Parse phân tích nội dung của exampleURL và trả về URL đã được phân tích. Chương trình này kết thúc bằng một lệnh gọi Println để minh họa các trường riêng lẻ trong cấu trúc của URL.
Hàm phân tích không kiểm tra sự tồn tại thực sự của một URL, nó chỉ phân tích cú pháp URL. Bạn có thể dùng http package để thực hiện truy vấn GET tới URL đó và kiểm tra phản hồi:
import (
"fmt"
"net/http"
)
func main() {
// The URL you want to check
exampleURL := "https://www.example.com"
// Make an HTTP GET request to the URL
response, err := http.Get(exampleURL)
if err != nil {
fmt.Println(err)
return
}
defer response.Body.Close()
// Check the response status code
if response.StatusCode == http.StatusOK {
fmt.Println("URL exists.")
} else {
fmt.Println("URL does not exist.")
}
}
Hàm main tạo truy vấn Get tới exampleURL bằng hàm Get của gói http. Hàm đó trả về một phản hồi và kiểu lỗi. Chương trình này kết thúc bằng lệnh if để xác thực sự tồn tại của trang web bằng cách kiểm tra mã trạng thái HTTP dựa trên hằng số StatusOK từ gói http.
Phương pháp này cho phép bạn thực hiện các hành động dựa trên kết quả kiểm tra như điều hướng người dùng tới trang khác, hiện thông báo lỗi hoặc thử lại yêu cầu sau một giai đoạn nhất định.
Mã hóa và giải mã tham số URL
Gói url cung cấp phương thức Encode để mã hóa các tham số URL. Hàm Encode mã hóa phần trăm các ký tự đặc biệt và khoảng cách trong các tham số URL.
import (
"fmt"
"net/url"
)
func main() {
// create a new url.Values struct
params := url.Values{}
// add values to the struct
params.Add("name", "John Smith")
params.Add("age", "30")
params.Add("gender", "male")
// encode the struct into a string
encodedParams := params.Encode()
fmt.Println(encodedParams)
// Output: "age=30&gender=male&name=John+Smith"
}
Hàm main tạo một phiên bản cấu trúc Values mới cho gói url và phương thức Add của phiên bản struct bổ sung các cặp dữ liệu giá trị chính cho cấu trúc mới đó.
Phương thức Encode chuyển đổi cặp giá trị chính cho định dạng chuỗi URL: "key1=value1&key2=value2&key3=value3".
Bạn có thể giải mã một chuỗi URL được mã hóa bằng hàm ParseQuery của gói url.
import (
"fmt"
"net/url"
)
func main() {
// encoded string of URL parameters
encodedParams := "age=30&gender=male&name=John+Smith"
// parse the encoded string into a url.Values struct
params, err := url.ParseQuery(encodedParams)
if err != nil {
fmt.Println(err)
}
// print the struct
fmt.Println(params)
// Output: map[age:[30] gender:[male] name:[John Smith]]
}
Biến encodedParameter là một chuỗi URL được mã hóa. Hàm ParseQuery nhận biến encodedParameter và trả về chuỗi URL đã giải mã cùng một lỗi.
URL bạn dùng cho các trang trong ứng dụng web đóng góp vào hiệu suất hoạt động và khả năng hiển thị của nó trên công cụ tìm kiếm. Bằng phương thức trên, bạn có thể cải thiện cả hai nhân tố này dễ dàng.