- Câu chuyện phát triển dự án LegiNote 2 - Kiến trúc hệ thống và Worker
- Phần thứ hai của câu chuyện phát triển dự án LegiNote, tập trung vào việc phát triển Worker bằng ngôn ngữ Go. Bài viết sẽ đề cập đến việc triển khai logic thu thập và cập nhật dữ liệu cũng như cách cấu trúc dự án.
Bài viết được dịch bởi AI.
Bài viết được tóm tắt bởi durumis AI
- Trong quá trình phát triển dự án LegiNote, chúng tôi đã thực hiện công việc lấy thông tin dự án luật từ OpenAPI của Quốc hội.
- Sử dụng ngôn ngữ Go, chúng tôi đã gửi yêu cầu HTTP để lấy dữ liệu và phân tích cú pháp dữ liệu JSON nhận được thành cấu trúc.
- Bài viết sẽ giải thích chi tiết quá trình, từ việc cấp quyền truy cập API đến việc gửi yêu cầu và phân tích cú pháp dữ liệu, đồng thời tìm kiếm các phương hướng cải thiện trong tương lai.
Xin chào, tôi là StatPan.
Tôi đang viết về quá trình phát triển dự án phụ LegiNote.
Hãy tham khảo phần trước thông qua liên kết sau.
Worker 1: worker-bill
Tên bill nghe có vẻ thân thiện như tên của một người bạn nước ngoài, và nó được lấy cảm hứng từ ý nghĩa của từ này.
Trước đây, khi tìm kiếm tên biến và tên kho lưu trữ phù hợp liên quan đến miền Quốc hội, tôi đã tìm thấy một số từ tiếng Anh và đã áp dụng chúng vào trường hợp này.
Ý nghĩa của từ bill
Thông số kỹ thuật OpenAPI của nơi mà Worker sẽ thu thập dữ liệu là như sau:
Tham số đầu vào
Tham số đầu vào của API xem xét và xử lý dự án luật
Tham số đầu ra
Tham số đầu vào của API xem xét và xử lý dự án luật
Dữ liệu được cung cấp khá nhiều và dường như có thể cung cấp thông tin chi tiết.
Chuẩn bị cho yêu cầu HTTP
Trước tiên, hãy xem xét những gì cần thiết để gửi yêu cầu HTTP với các tham số đầu vào ở trên.
URL, Phương thức yêu cầu HTTP(không có trong hình nhưng là Get, không hỗ trợ Post ㅠ), KEY, Type, pIndex, pSize là các giá trị cần thiết.
Đối với giá trị KEY, tương tự như các OpenAPI khác, bạn cần phải nhận được một khóa xác thực riêng biệt.
Vì đây là bài viết về quá trình phát triển, nên tôi muốn đưa ra liên kết tham khảo nếu có... nhưng do nó vẫn còn khá nhỏ nên không có bài viết nào hướng dẫn cách nhận khóa xác thực trên Google... Trước tiên, tôi xin phép được giải thích sơ lược thông qua hình ảnh ở đây...
Giao diện trang chủ
Nhấn vào nút Trang cá nhân trên màn hình chính.
Giao diện trang cá nhân
Giao diện cấp quyền truy cập API
Trong hình ảnh trên, đối với mục đích sử dụng hoặc nội dung, trong trường hợp của tôi, tôi đã viết đơn giản là "cho cuộc thi dữ liệu công khai". Bạn không cần phải quá lo lắng về việc điền nội dung, miễn là không có lý do không phù hợp (??) trong 1-2 dòng, tôi nghĩ rằng nó sẽ được chấp thuận ngay lập tức.
Khóa mà bạn nhận được sẽ cấp KEY cần thiết cho phần mô tả HTTP ở trên.
Hãy thử gửi một yêu cầu đến URL ở trên (tôi hy vọng rằng lần cập nhật tiếp theo sẽ bao gồm cả phương thức).
go```go package main import ( "encoding/json" "fmt" "io" "log" "net/http" "net/url" ) func procErr(e error, msg string) { if e != nil { log.Fatal(e, msg) } } func main() { rawUrl := "https://open.assembly.go.kr/portal/openapi/TVBPMBILL11" parsedUrl, err := url.Parse(rawUrl) procErr(err, "err after parsedUrl") params := url.Values{} KEY := "your_key" //change this procErr(err, "err after req, 27") req.Header.Add("Content-Type", "application/json") req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36") params.Add("KEY", KEY) params.Add("Type", "json") // JSON 좋.아 params.Add("pIndex", "1") // 이건 왜 integer로 표시했는지 모르겠지만 string params.Add("pSize", "1") client := &http.Client{} reqURL := fmt.Sprintf("%s?%s", rawUrl, params.Encode()) req, err := http.NewRequest(http.MethodGet, reqURL, nil) res, err := client.Do(req) procErr(err, "err, after client do") defer res.Body.Close() var jsonMap any response, err := io.ReadAll(res.Body) procErr(err, "err after read response") err = json.Unmarshal(response, &jsonMap) procErr(err, "err after json unmarshal") fmt.Println(jsonMap)
```
Tôi đã có thể xác minh hoạt động bằng cách sử dụng mã trên.
Một mẹo nhỏ cho các bạn là phải thêm Header. Nếu bạn muốn sử dụng API này một cách suôn sẻ thì phải làm như vậy (bán đe dọa).
Sau đó, hãy điền vào các tham số bắt buộc cho URL Get.
Các giá trị của pIndex và pSize được yêu cầu là kiểu số nguyên, nhưng bạn vẫn có thể sử dụng kiểu chuỗi (không thể hiểu được).
Kiểu dữ liệu xml cũng có thể được sử dụng cho Type, nhưng tôi đã chọn Json.
Kết quả
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:Đã xử lý thành công.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:Dự thảo Luật sửa đổi một phần Luật về Quỹ chính trị BILL_NO:2203179 CMT_PRESENT_DT: CMT_PROC_DT: CMT_PROC_RESULT_CD: COMMITTEE_DT: COMMITTEE_PROC_DT: CURR_COMMITTEE: CURR_COMMITTEE_ID: LAW_PRESENT_DT: LAW_PROC_DT: LAW_PROC_RESULT_CD: LAW_SUBMIT_DT: LINK_URL:https://likms.assembly.go.kr/bill/billDetail.do?billId=PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 PROC_DT: PROC_RESULT_CD: PROPOSER:Nghị sĩ Go Dong-jin và 10 người khác PROPOSER_KIND:Nghị sĩ PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:Go Dong-jin] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:Dự thảo Luật sửa đổi một phần Luật về Đảng phái chính trị BILL_NO:2203178 CMT_PRESENT_DT: CMT_PROC_DT: CMT_PROC_RESULT_CD: COMMITTEE_DT: COMMITTEE_PROC_DT: CURR_COMMITTEE: CURR_COMMITTEE_ID: LAW_PRESENT_DT: LAW_PROC_DT: LAW_PROC_RESULT_CD: LAW_SUBMIT_DT: LINK_URL:https://likms.assembly.go.kr/bill/billDetail.do?...
Bạn có thể nhận được kết quả như trên.
Riêng tôi, để kiểm soát trực tiếp đối tượng đó, tôi đã định nghĩa tất cả các cấu trúc và lấy giá trị, và điều này cũng khiến tôi phải gỡ lỗi rất nhiều.
Việc giải mã thành cấu trúc đối với giá trị đó có vẻ sẽ phải tiếp tục trong phần tiếp theo do giới hạn số lượng ký tự.
Chỉ một yêu cầu đã chiếm hết một phần của quá trình phát triển. Tất nhiên, do đặc điểm của việc sử dụng OpenAPI này, tôi đã dành khá nhiều thời gian để sử dụng API và thiết lập cấu trúc, nhưng tôi cần phải tìm ra một cách để những người khác không phải trải qua những khó khăn tương tự.
Nếu có bất kỳ yêu cầu nào không hoạt động như mong đợi hoặc bạn không hài lòng với mã ngu ngốc của tôi, hãy chuẩn bị cả thuốc lá nhé.