- LegiNote projektfejlesztési történet 2. rész - Tech stack és worker
- A LegiNote projektfejlesztési történetének második része, amely a Go nyelven fejlesztett worker fejlesztésével foglalkozik. Bemutatja az adatgyűjtési és frissítési logika megvalósítását, valamint a projekt felépítését.
AI által fordított szöveg.
A bejegyzés durumis AI által generált összefoglalója
- A LegiNote projekt fejlesztése során elvégeztük a jogszabálytervezetek adatainak beszerzését a Parlament nyílt API-ja segítségével.
- Go nyelvet használtunk az adatok HTTP kéréssel történő lekéréséhez, majd a kapott JSON adatok struktúrákká alakításához.
- Bemutatjuk a folyamatot az API kulcs beszerzésétől az adatlekérésen és -feldolgozáson át, és vázoljuk a jövőbeni fejlesztési irányokat.
Üdvözlet, StatPan vagyok.
A LegiNote mellékprojekt fejlesztési naplóját írom.
Az előző részt a következő linken találja:
1. munkás: worker-bill
A "bill" név valahogy ismerősen hangzik, mintha egy külföldi barát neve lenne, és a következő szó jelentéséből merítettem ihletet.
A megfelelő változónév és adattárnév keresése során korábban már keresgéltem néhány angol szót a parlamenti domainnel kapcsolatban, és most ezt használtam fel.
a bill szó jelentése
A munkás által célzott adatokat gyűjtő OpenAPI specifikációja a következő:
Bemeneti paraméterek
Jogi aktusok vizsgálata és feldolgozása API bemeneti paraméterek
Kimeneti paraméterek
Jogi aktusok vizsgálata és feldolgozása API bemeneti paraméterek
Sok adatot biztosít, és úgy tűnik, elég részletes információkat tud szolgáltatni.
HTTP kérés előkészítése
Először nézzük meg, mire van szükségünk a fenti bemeneti paraméterekkel rendelkező HTTP kérés elküldéséhez:
URL, HTTP kérés metódus(bár itt nem szerepel, Get metódust kell használni, Post nem működik), KEY, Type, pIndex, pSize értékek.
A KEY érték esetében, más OpenAPI-khoz hasonlóan, külön engedélyezési kulcsot kell kérni.
Mivel fejlesztési naplóról van szó, szerettem volna hivatkozást is megadni… de mivel még viszonylag új, nincs róla információ a Google-ben az engedélyezési kulcs kéréséről… Szóval, most itt egy pár képpel illusztrálom a folyamatot…
Kezdőképernyő
A kezdőképernyőn kattintson a "Saját oldal" gombra.
Saját oldal
API kulcs kiadás képernyő
A fenti képen a "Felhasználási cél" és a "Tartalom" mezőkbe én egyszerűen annyit írtam, hogy "Nyilvános adatverseny céljára". A tartalom kitöltésével kapcsolatban nem kell nagyon aggódni, 1-2 sornyi szöveg elég, hacsak nem valami kellemetlen okból kéred a kulcsot.
A kapott kulcs lesz az a KEY, amire a fenti HTTP leírásban szükség van.
A fenti URL-re (a következő frissítésben remélem a metódust is feltüntetik) küldjünk el egy kérést.
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)
```
A fenti kóddal sikerült ellenőrizni a működést.
Egy kis tipp: feltétlenül adjon hozzá fejlécet, ha zökkenőmentesen szeretné használni az API-t. (Félig-meddig fenyegetés)
Ezután töltse ki a Get URL kötelező paramétereit.
A pIndex és a pSize értékeknél integer típus szerepel, de string típus használatával is működik. (Érthetetlen)
A Type paraméterben XML formátumot is használhat, én a JSON-t választottam.
Eredmény
map[TVBPMBILL11:[map[head:[map[list_total_count:103305] map[RESULT:map[CODE:INFO-000 MESSAGE:정상 처리되었습니다.]]]] map[row:[map[AGE:22 BILL_ID:PRC_T2U4C0A8B2Z0A1Y3Y5G2H0F0G5E4F4 BILL_NAME:정치자금법 일부개정법률안 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:고동진의원 등 10인 PROPOSER_KIND:의원 PROPOSE_DT:2024-08-23 RST_MONA_CD:HS39431V RST_PROPOSER:고동진] map[AGE:22 BILL_ID:PRC_O2M4M0L8L2T0R1S3Q5R1P4Q0Y2W2X6 BILL_NAME:정당법 일부개정법률안 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?...
A fenti eredményt kapjuk.
Én külön definiáltam az összes struktúrát, hogy közvetlenül kezelhessem az objektumokat, de ehhez rengeteg hibakeresésre volt szükség.
A struktúrába történő Unmarshal műveletet valószínűleg a következő részben folytatom, mert a karakterkorlát miatt nem fér bele.
Egyetlen kérés elfoglalta a fejlesztési napló egy részét. Persze, az API használata és a struktúra kialakítása sok időt vett igénybe. Ennek a problémának a megoldását meg kell találnom, hogy másoknak ne kelljen ugyanezt a kínlódást átélniük.
Ha a fenti kérés nem működik a várt módon, vagy nem tetszik a kódom, akkor kérlek, hozz egy doboz cigit is.