Golang đại pháp – 1.5 Lấy thông tin từ URL
Go
41
golang
39
White

nhaancs viết ngày 04/01/2018

Bài viết được đăng tải đầu tiên tại: http://nhaancs.com/golang-dai-phap-1-5-lay-thong-tin-tu-url
golang dai phap

Đối với nhiều ứng dụng, việc truy cập thông tin từ Internet cũng quan trọng như việc truy xuất thông tin ở local. Go cung cấp các package được nhóm lại trong package net giúp cho chúng ta dễ dàng hơn trong việc gửi và nhận thông tin từ Internet, tạo các network connection cấp thấp và thiết lập server, kết hợp với tính năng concurrency vô cùng lợi hại.

Để minh hoạ cho sự dễ dàng của việc lấy thông tin thông qua HTTP, chúng ta cùng xem qua một ví dụ đơn giản gọi là fetch (fetch.go). Chương trình này dùng để lấy nội dung của url truyền vào và in ra màn hình.

// Lấy nội dung từ url và in ra màn hình
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    for _, url := range os.Args[1:] {
        resp, err := http.Get(url)
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
            os.Exit(1)
        }

        b, err := ioutil.ReadAll(resp.Body)
        resp.Body.Close()
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
            os.Exit(1)
        }
        fmt.Printf("%s\n", b)
    }
}

Chương trình giới thiệu một số function của 2 package, net/httpio/ioutil. Function http.Get tạo một HTTP request, nếu không có lỗi thì trả kết quả response về struct resp. Field Body của resp chứa response của server dạng stream. Tiếp theo ioutil.ReadAll đọc toàn bộ response, trả về kết quả cho biến b. Stream Body đượ đóng lại để tránh tràn bộ nhớ. Cuối cùng Printf in kết quả ra màn hình.

$ go build fetch.go 

$ ./fetch https://google.com

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="vi"><head><meta content="text/html;...

Nếu HTTP request thất bại, chương trình sẽ báo lỗi:

$ ./fetch https://noexist.google.com

fetch: Get https://noexist.google.com: dial tcp 125.235.4.59:443: i/o timeout

Khi có lỗi xảy ra thì os.Exit(1) sẽ dừng thực thi chương trình và thoát.

Bài tập dành cho bạn:

Exercise 1.7: Hàm io.Copy(dst, src) đọc nội dung từ src và copy vào dst, dùng hàm này thay vì ioutil.ReadAll để copy nội dung body của response tới os.Stdout, nhớ kiểm tra lỗi trả về của hàm io.Copy.

Exercise 1.8: Chỉnh sửa fetch để thêm tiền tố http:// vào các url chưa có. Gợi ý: dùng hàm strings.HasPrefix.

Exercise 1.9: Chỉnh sửa fetch để in thêm HTTP status code, trong resp.Status.

Reference: The Go Programming Language

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

nhaancs

11 bài viết.
3 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
7 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết hơn 1 năm trước
7 2
White
39 15
Go là gì? Dùng nó cho việc gì? Chắc hẳn đến thời điểm hiện tại, không ai là chưa nghe đến Go (hay còn gọi là Golang), một ngôn ngữ lập trình được ...
Huy Trần viết hơn 2 năm trước
39 15
White
22 3
Introduction Buffering (buffered IO) là một trong những kỹ thuật kinh điển khi chúng ta cần đọc/ghi dữ liệu. Trong bài viết này mình sẽ đi sâu hơn...
Linh Tran Tuan viết 4 tháng trước
22 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
11 bài viết.
3 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!