- Kisah Pengembangan Proyek LegiNote 2 - Stack Teknologi dan Worker
- Bagian kedua dari kisah pengembangan proyek LegiNote, membahas tentang pengembangan worker menggunakan bahasa Go. Artikel ini mencakup implementasi logika pengumpulan dan pembaruan data, serta cara proyek disusun.
Teks yang diterjemahkan oleh AI.
Ringkasan posting oleh durumis AI
- Selama pengembangan proyek LegiNote, kami melakukan tugas mengambil informasi RUU dari OpenAPI Parlemen.
- Kami menggunakan bahasa Go untuk mengirimkan HTTP Request guna meminta data, dan kemudian memparse data JSON yang diterima menjadi struktur data.
- Artikel ini menjelaskan proses penerbitan API key, permintaan data, hingga proses parsing, serta mengeksplorasi potensi pengembangan di masa depan.
Halo, saya StatPan.
Saya sedang menulis tentang pengembangan proyek sampingan LegiNote.
Untuk bagian sebelumnya, silakan lihat tautan berikut.
Worker 1: worker-bill
Nama "bill" terdengar seperti nama teman asing yang akrab, dan inspirasi namanya datang dari arti kata berikut.
Untuk mencari nama variabel dan repositori yang tepat, sebelumnya saya telah mencari berbagai istilah bahasa Inggris yang berkaitan dengan domain parlemen, dan saya menggunakannya kembali.
Arti kata bill
Spesifikasi OpenAPI tempat Worker akan mengumpulkan data adalah sebagai berikut:
Parameter Input
Parameter Input API Pemeriksaan dan Pengolahan RUU
Parameter Output
Parameter Input API Pemeriksaan dan Pengolahan RUU
Data yang disediakan cukup banyak, dan tampaknya dapat memberikan informasi yang cukup detail.
Persiapan Http Request
Pertama-tama, mari kita lihat apa saja yang dibutuhkan untuk permintaan Http Request dengan parameter input di atas.
URL, metode permintaan Http(Meskipun tidak disebutkan di sini, Get ya, Post tidak berfungsi), KEY, Type, pIndex, pSize adalah nilai yang diperlukan.
Untuk nilai KEY, seperti OpenAPI lainnya, Anda perlu mendapatkan kunci autentikasi terpisah.
Karena ini adalah cerita tentang pengembangan, saya ingin menyertakan tautan ke referensi jika ada... Namun, karena masih tergolong minor, sepertinya tidak ada postingan di Google yang menjelaskan cara mendapatkan kunci autentikasi... Untuk saat ini, saya akan menjelaskannya dengan gambar saja...
Halaman Utama
Tekan tombol My Page di halaman beranda.
Halaman Profil Saya
Layar Penerbitan API Key
Pada layar di atas, untuk bagian penggunaan atau konten, dalam kasus saya, saya menulis dengan singkat bahwa itu untuk tujuan kompetisi data publik. Anda tidak perlu terlalu khawatir tentang bagian pengisian konten, saya rasa Anda akan langsung mendapatkan persetujuan selama tidak ada alasan yang tidak pantas (?).
Kunci yang Anda dapatkan akan mengeluarkan KEY yang dibutuhkan dalam penjelasan HTTP di atas.
Mari kita coba mengirimkan permintaan ke URL di atas (Semoga di pembaruan berikutnya, metode juga disertakan).
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") // Ini mengapa ditampilkan sebagai integer, tetapi 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)
```
Dengan kode seperti di atas, saya dapat memverifikasi operasinya.
Sebagai tips, Anda harus menambahkan Header. Jika Anda ingin menggunakan API ini dengan lancar (ancaman).
Setelah itu, isi param yang diperlukan di Get url.
Untuk nilai pIndex dan pSize, meskipun tertulis integer, Anda tetap dapat menggunakan tipe string. (Tidak mengerti)
Tipe juga dapat menggunakan metode xml, tetapi saya memilih Json.
Nilai Hasil
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:Pemrosesan berhasil.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:Rancangan Undang-Undang tentang Perubahan Sebagian Undang-Undang tentang Dana Politik 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:Anggota DPR RI, dkk. PROPOSER_KIND:Anggota DPR PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:Anggota DPR RI, dkk.] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:Rancangan Undang-Undang tentang Perubahan Sebagian Undang-Undang tentang Partai Politik 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?...
Anda dapat memperoleh nilai hasil seperti di atas.
Secara terpisah, untuk mengontrol objek tersebut secara langsung, saya mendefinisikan semua struct dan mengambil nilainya, dan itu juga melewati banyak proses debugging.
Mengenai Unmarshal nilai tersebut ke dalam struct, karena batasan jumlah karakter, saya rasa saya harus melanjutkannya di bagian selanjutnya.
Satu Request telah menghabiskan satu bagian dari cerita pengembangan ini. Tentu saja, mengingat karakteristik penggunaan OpenAPI ini, saya menghabiskan banyak waktu untuk menggunakan API dan mengatur struktur struct, tetapi saya perlu mencari cara agar orang lain tidak mengalami kesulitan yang sama.
Bagi Anda yang mengalami masalah dengan permintaan di atas atau tidak puas dengan kode saya yang aneh, silakan siapkan rokoknya juga.