Cách thực hiện các yêu cầu HTTP trong Go
Một trong những nguyên tắc cơ bản chi phối hoạt động của World Wide Web là trao đổi yêu cầu và phản hồi. Khi bạn gửi yêu cầu truy cập một trang web, máy chủ sẽ phản hồi với dữ liệu phù hợp.
Các giao thức phổ biến chi phối các loại giao tiếp internet khác nhau bao gồm HTTP (Giao thức truyền tải siêu văn bản), FTP (Giao thức truyền tệp) và SMTP (Giao thức chuyển thư đơn giản).
HTTP là giao thức bạn thường sử dụng khi xem trang web hoặc sử dụng ứng dụng hỗ trợ web. Bạn cũng có thể làm việc với các yêu cầu HTTP từ nhiều ngôn ngữ lập trình, bao gồm cả Go.
Mục Lục
Yêu cầu HTTP là gì?
HTTP xác định cách máy khách, như trình duyệt web, gửi yêu cầu đến máy chủ, sau đó trả lại phản hồi. Yêu cầu HTTP chứa thông tin về tài nguyên mà máy khách đang cố truy cập. Thông báo yêu cầu thường bao gồm một URL xác định tài nguyên và dữ liệu tùy chọn khác như tiêu đề và tham số truy vấn.
Có một số loại yêu cầu HTTP, bao gồm GET, POST, PUT, DELETE, HEAD, OPTIONS và CONNECT. Bốn loại phương pháp đầu tiên là phổ biến nhất; chúng phản ánh các hoạt động CRUD đọc, tạo, cập nhật và xóa tương ứng.
Loại yêu cầu PUT thường được sử dụng thay thế cho loại yêu cầu PATCH. Chúng đạt được cùng một mục đích, chúng chỉ khác nhau về dữ liệu mà chúng muốn yêu cầu đưa vào.
Gửi yêu cầu bằng các phương thức HTTP phổ biến
Tích hợp sẵn Go http gói cung cấp một tập hợp các chức năng và cấu trúc mà bạn có thể sử dụng để tạo máy chủ web và quản lý các yêu cầu HTTP. Đó là một gói rất mạnh mẽ và tất cả các khung công tác web của Go đều được xây dựng dựa trên nó theo cách này hay cách khác. Nó là một gói con của Go’s mạng lưới bưu kiện.
Để tạo một yêu cầu HTTP trong Go, bạn có thể sử dụng http.NewRequest() chức năng và đặt phương thức, URL, tiêu đề và nội dung yêu cầu thích hợp. Sau khi tạo yêu cầu, bạn có thể sử dụng Go mạng/http gói của http.Client{} cấu trúc để chạy nó và nhận phản hồi.
Các mẫu mã sau sử dụng reqres.in, một API có sẵn công khai để kiểm tra các yêu cầu HTTP. Bạn có thể sử dụng nó để kiểm tra các yêu cầu GET, POST, PUT và DELETE trong các chương trình Go của mình.
ĐĂNG Yêu cầu
Đoạn mã dưới đây là một hàm gửi yêu cầu POST tới /api/người dùng điểm cuối của reqres.in để tạo người dùng mới có tên và công việc.
package mainimport (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func createUser(name, job string) {
fmt.Println("Creating user...")
apiUrl := "https://reqres.in/api/users"
userData := []byte(`{"name":"` + name + `","job":"` + job + `"}`)
request, error := http.NewRequest("POST", apiUrl, bytes.NewBuffer(userData))
request.Header.Set("Content-Type", "application/json; charset=utf-8")
client := &http.Client{}
response, error := client.Do(request)
if error != nil {
fmt.Println(error)
}
responseBody, error := io.ReadAll(response.Body)
if error != nil {
fmt.Println(error)
}
formattedData := formatJSON(responseBody)
fmt.Println("Status: ", response.Status)
fmt.Println("Response body: ", formattedData)
defer response.Body.Close()
}
định dạngJSON là một chức năng tùy chỉnh mà bạn có thể viết để định dạng dữ liệu đầu ra. Đây là cách bạn có thể thực hiện nó:
func formatJSON(data []byte) string {
var out bytes.Buffer
err := json.Indent(&out, data, "", " ") if err != nil {
fmt.Println(err)
}
d := out.Bytes()
return string(d)
}
Bạn có thể gọi tạo người dùng() chức năng trong một chương trình như thế này:
func main() {
fmt.Println("Making POST request...")
createUser("Tim Omolana", "Writer")
}
Khi bạn chạy chương trình trong một thiết bị đầu cuối, sử dụng hãy chạy
NHẬN yêu cầu
Đoạn mã sau là một hàm gửi yêu cầu GET để truy xuất người dùng từ máy chủ reqres.in bằng ID duy nhất của họ.
func getUser(id string) {
fmt.Println("Getting user by ID...")
apiUrl := "https://reqres.in/api/users/" + id
request, error := http.NewRequest("GET", apiUrl, nil)
if error != nil {
fmt.Println(error)
}
request.Header.Set("Content-Type", "application/json; charset=utf-8")
client := &http.Client{}
response, error := client.Do(request)
if error != nil {
fmt.Println(error)
}
responseBody, error := io.ReadAll(response.Body)
if error != nil {
fmt.Println(error)
}
formattedData := formatJSON(responseBody)
fmt.Println("Status: ", response.Status)
fmt.Println("Response body: ", formattedData)
defer response.Body.Close()
}
Yêu cầu GET không gửi dữ liệu đến máy chủ nên nó không chấp nhận hoặc gửi nội dung yêu cầu đến máy chủ khi được thực hiện. Đây là ví dụ gọi hàm trên sẽ như thế nào:
func main() {
fmt.Println("Making GET request...")
getUser("2")
}
Đầu ra:
Yêu cầu ĐẶT
Yêu cầu PUT rất giống với yêu cầu POST vì nó cũng gửi dữ liệu đến máy chủ. Sự khác biệt chính là POST tạo tài nguyên mới trong khi PUT cập nhật tài nguyên hiện có.
Đây là cách triển khai yêu cầu PUT:
func updateUser(name, job, id string) {
fmt.Println("Updating user...")
apiUrl := "https://reqres.in/api/users/" + id
userData := []byte(`{"name":"` + name + `","job":"` + job + `"}`)
request, error := http.NewRequest("PUT", apiUrl, bytes.NewBuffer(userData))
request.Header.Set("Content-Type", "application/json; charset=utf-8")
}
Từ mã này, bạn có thể thấy sự khác biệt duy nhất giữa yêu cầu PUT và yêu cầu POST ở trên là tên phương thức và URL. Khi sử dụng PUT để cập nhật dữ liệu hiện có, bạn sẽ cần thêm id vào URL yêu cầu. Một cuộc gọi mẫu đến chức năng này sẽ như thế này:
func main() {
updateUser("Tim Newname", "Staff Writer", "2")
}
Đoạn mã trên cập nhật người dùng và tạo đầu ra sau:
Xóa yêu cầu
Sử dụng phương thức yêu cầu XÓA để thực hiện thao tác xóa trên máy chủ web. Yêu cầu xóa sẽ xóa tài nguyên được URI xác định. Một yêu cầu XÓA trong Go trông như thế này:
func deleteUser(id string) {
fmt.Println("Deleting user...")
apiUrl := "https://reqres.in/api/users/" + id
request, error := http.NewRequest("DELETE", apiUrl, nil)
request.Header.Set("Content-Type", "application/json; charset=utf-8")
client := &http.Client{}
response, error := client.Do(request)
if error != nil {
fmt.Println(error)
}
fmt.Println("Status: ", response.Status)
}
Một yêu cầu DELETE không chấp nhận cũng như không trả về phần thân, do đó không cần phân tích cú pháp hoặc định dạng phần thân phản hồi và yêu cầu JSON. Phản hồi chỉ trả về một trạng thái để cho biết thành công hay thất bại. Đây là cách gọi hàm mẫu với đầu ra của nó:
func main() {
fmt.Println("Making DELETE request...")
deleteUser("2")
}
Đầu ra:
Tiết kiệm thời gian bằng cách sử dụng http.Bài đăng() Và http.Nhận() các phương pháp từ mạng/http gói để làm BƯU KIỆN Và LẤY yêu cầu trực tiếp mà không cần phải sử dụng Yêu cầu mới() chức năng và Khách hàng{} cấu trúc để tạo và thực hiện yêu cầu riêng biệt. Kiểm tra tài liệu mạng/http để biết thêm thông tin.
Thực hiện các yêu cầu HTTP trong ứng dụng Go
Các http gói trong Go cung cấp mọi thứ cần thiết để thực hiện yêu cầu HTTP và xử lý phản hồi trong ứng dụng Go. Các chức năng và cấu trúc do gói cung cấp cho phép bạn tạo và gửi các loại yêu cầu khác nhau như GET, POST, PUT, DELETE, v.v.
Điều này giúp dễ dàng xây dựng các ứng dụng web trong Go có thể tương tác với các dịch vụ web và API khác. Một cách hay để làm quen với việc tạo các yêu cầu HTTP trong Go là xây dựng một ứng dụng tạo các yêu cầu tới một API REST khác của bạn.