- LegiNote Project Ontwikkelverhaal 2 - Technologie Stack en Worker
- Het tweede deel van het LegiNote projectontwikkelverhaal gaat over de ontwikkeling van de worker met behulp van de Go-programmeertaal. We bespreken de implementatie van de logica voor het verzamelen en updaten van gegevens, en hoe het project is gestructu
Dit is een door AI vertaalde tekst.
Samenvatting van de tekst door durumis AI
- Tijdens de ontwikkeling van het LegiNote-project hebben we gewerkt aan het ophalen van wetsvoorstelgegevens via de Nationale Vergadering OpenAPI.
- We hebben Go gebruikt om via HTTP Request gegevens op te vragen en de ontvangen JSON-gegevens te parseren naar structs.
- We beschrijven het proces, van het verkrijgen van een API-sleutel tot het aanvragen en parseren van gegevens, en verkennen mogelijke verbeteringen in de toekomst.
Hallo, dit is StatPan.
Ik schrijf over de ontwikkelingsgeschiedenis van het LegiNote-zijproject.
Raadpleeg de volgende link voor het vorige deel.
Werker 1: worker-bill
De naam 'bill' klinkt als de naam van een buitenlandse vriend, maar de inspiratie komt van de volgende woordbetekenis.
Om geschikte variabelenamen en repositorynamen te vinden, heb ik eerder naar verschillende Engelse woorden gezocht die verband hielden met het domein van het parlement. Ik heb toen gevonden wat ik nodig had en het toegepast.
De betekenis van het woord 'bill'
De OpenAPI-specificatie van de locatie waar de Worker gegevens moet verzamelen, is als volgt.
Invoerparameters
Invoerparameters voor de API voor de beoordeling en behandeling van wetsvoorstellen
Uitvoerparameters
Invoerparameters voor de API voor de beoordeling en behandeling van wetsvoorstellen
Het lijkt erop dat er veel gegevens worden aangeboden en dat er vrij gedetailleerde informatie kan worden geleverd.
Benodigde onderdelen voor HTTP-aanvraag
Laten we eerst eens kijken wat er nodig is om een HTTP-aanvraag te doen met de bovenstaande invoerparameters.
URL, HTTP-aanvraagmethode(hoewel dit hier niet wordt weergegeven, is het GET. POST is niet toegestaan), KEY, Type, pIndex, pSize waarden.
Voor de KEY-waarde moet u, net als bij andere OpenAPI's, een aparte authenticatiesleutel aanvragen.
Omdat dit een blogpost is over ontwikkeling, wilde ik graag een link naar een referentie toevoegen, maar vanwege de beperkte bekendheid zijn er geen Google-resultaten te vinden over hoe je een authenticatiesleutel kunt aanvragen... Laten we het in ieder geval hier kort schetsen met afbeeldingen...
Homepage
Klik op de knop 'Mijn pagina' op het startscherm.
Mijn pagina
Scherm voor het aanvragen van een API-sleutel
In het bovenstaande scherm heb ik in mijn geval kort 'Doeleinden voor gebruik/Inhoud: openbare gegevens wedstrijd' ingevuld. U hoeft zich geen zorgen te maken over het invullen van de inhoud. Zolang u 1 of 2 regels schrijft die geen ongepaste redenen bevatten, denk ik dat u onmiddellijk goedkeuring krijgt.
De sleutel die u op deze manier verkrijgt, geeft u de KEY die nodig is voor de bovenstaande HTTP-beschrijving.
Laten we een aanvraag doen naar de bovenstaande URL (ik hoop dat de methode in de volgende update ook wordt weergegeven).
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") // this is why it's integer, but it's 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)
```
Ik kon met behulp van de bovenstaande code de werking controleren.
Als tip wil ik u laten weten dat u de header absoluut moet toevoegen als u deze API soepel wilt gebruiken. (Half-dreigement)
Vervolgens vult u de vereiste parameters voor de GET-URL in.
Voor de waarden van pIndex en pSize staat er dat u een integer moet gebruiken, maar het werkt ook als u een string-type gebruikt. (Onbegrijpelijk)
U kunt ook de XML-methode gebruiken voor Type, maar ik heb gekozen voor JSON-parsing.
Resultaatwaarde
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?...
U kunt de bovenstaande resultaatwaarde verkrijgen.
Omdat ik het object zelf wil beheren, heb ik alle structuur gedefinieerd om de waarde op te halen, maar ook dit kostte veel tijd voor foutopsporing.
Vanwege de tekstenbeperking zal ik het unmarshalen van deze waarde naar structuur waarschijnlijk in het volgende deel moeten beschrijven.
Eén aanvraag heeft een heel deel van de ontwikkelingsgeschiedenis in beslag genomen. Natuurlijk kost het veel tijd om de API te gebruiken en de structuur van de API op te zetten, maar ik moet een manier vinden om te voorkomen dat anderen dezelfde problemen tegenkomen.
Als er iets niet naar verwachting werkt in de bovenstaande aanvraag of als u problemen hebt met mijn vreemde code, zorg dan dat u ook wat sigaretten meeneemt.