- LegiNote Projektentwicklungsgeschichte 2 - Technologie-Stack und Worker
- Der zweite Teil der LegiNote Projektentwicklungsgeschichte befasst sich mit der Entwicklung von Workern mithilfe der Programmiersprache Go. Es werden die Implementierung der Datenakquise- und Aktualisierungslogik sowie die Projektstruktur vorgestellt.
Dies ist eine KI-übersetzte Version.
Zusammenfassung des Beitrags durch durumis AI
- Während der Entwicklung des LegiNote-Projekts haben wir die Aufgabe übernommen, Gesetzesvorschläge mithilfe der Nationalversammlungs-OpenAPI abzurufen.
- Mit der Go-Sprache haben wir HTTP-Requests verwendet, um Daten anzufordern, und die empfangenen JSON-Daten in Strukturen geparst.
- Dieser Beitrag erläutert den Prozess von der Ausstellung des API-Schlüssels über die Datenanforderung bis hin zum Parsen und sucht nach zukünftigen Verbesserungsmöglichkeiten.
Hallo, ich bin StatPan.
Ich schreibe über die Entwicklung des LegiNote-Side-Projekts.
Für den vorherigen Teil, konsultieren Sie bitte den folgenden Link.
Worker 1: worker-bill
Der Name "bill" klingt irgendwie vertraut, wie der Name eines ausländischen Freundes. Die Inspiration dafür kam von der folgenden Wortbedeutung.
Um passende Variablen- und Repository-Namen zu finden, habe ich mich in der Vergangenheit mit verschiedenen englischen Begriffen beschäftigt, die mit dem Bereich des Parlaments zu tun hatten. Ich habe eines dieser Wörter wiederverwendet.
Bedeutung des Wortes bill
Die OpenAPI-Spezifikation des Ziels, für das der Worker Daten sammeln soll, sieht wie folgt aus:
Eingabeparameter
Eingabeparameter der API zur Prüfung und Bearbeitung von Gesetzesvorschlägen
Ausgabeparameter
Eingabeparameter der API zur Prüfung und Bearbeitung von Gesetzesvorschlägen
Es werden viele Daten bereitgestellt und es sieht so aus, als ob ziemlich detaillierte Informationen bereitgestellt werden können.
Benötigte Elemente für die HTTP-Anfrage
Wenn wir uns zunächst ansehen, was für die HTTP-Anfrage der oben genannten Eingabeparameter benötigt wird, dann sind das:
URL, HTTP-Anfragemethode(hier nicht angegeben, aber Get ist erforderlich, Post funktioniert nicht ㅠ), KEY, Type, pIndex, pSize Werte.
Der KEY-Wert muss, wie bei anderen OpenAPIs, separat angefordert werden.
Da es sich hier um eine Entwicklergeschichte handelt, wollte ich einen Link zu einer Referenz einfügen, aber da es noch nicht so weit verbreitet ist, gibt es im Google keine Beiträge, die erklären, wie man einen Schlüssel erhält... Lassen Sie mich zunächst kurz auf das Bild oben eingehen...
Startseite
Klicken Sie auf der Startseite auf die Schaltfläche „Mein Profil“.
Meine Seite
Bildschirm zum Ausstellen des API-Schlüssels
Im obigen Bildschirm habe ich in meinem Fall einfach „Zweck des Gebrauchs für den öffentlichen Datensatzwettbewerb“ geschrieben. Machen Sie sich keine großen Sorgen um den Teil, in dem Sie die Inhalte ausfüllen. Ich denke, Sie werden sofort genehmigt werden, solange Sie 1-2 Zeilen schreiben, die keinen böswilligen Hintergrund haben.
Der so erhaltene Schlüssel wird Ihnen den KEY ausgeben, der für die obige HTTP-Erklärung benötigt wird.
Ich werde eine Anfrage an die obige URL senden (ich hoffe, dass die Methode beim nächsten Update ebenfalls angegeben wird).
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 integer type but string type is ok 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)
```
Mit dem obigen Code konnte ich die Funktion zunächst überprüfen.
Als Tipp sei gesagt, dass Sie unbedingt den Header hinzufügen müssen, wenn Sie diese API einwandfrei nutzen möchten. (Halb Androhung)
Danach füllen Sie die für die Get-URL erforderlichen Parameter aus.
Für die Werte von pIndex und pSize steht zwar integer, aber es funktioniert auch mit String-Typen. (Unverständlich)
Für den Typ kann auch XML verwendet werden, aber ich habe mich für JSON entschieden.
Ergebniswert
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?...
Sie erhalten den obigen Ergebniswert.
Ich habe alle Strukturen definiert, um das Objekt separat zu steuern und die Werte abzurufen. Auch hier gab es unzählige Debugging-Runden.
Das Unmarshaling dieses Werts in eine Struktur wird wahrscheinlich im nächsten Teil aufgrund der Beschränkung der Zeichenanzahl fortgesetzt werden müssen.
Eine einzige Anfrage hat in der Entwicklungsphase einen ganzen Teil eingenommen. Natürlich hat es aufgrund der Eigenschaften dieser OpenAPI viel Zeit gekostet, die API zu nutzen und die Struktur zu erstellen. Ich muss eine Möglichkeit finden, wie andere Entwickler nicht die gleichen Probleme haben müssen.
Wenn bei den obigen Anfragen etwas nicht wie erwartet funktioniert oder Sie mit meinem seltsamen Code nicht einverstanden sind, bitte ich Sie auch um eine Zigarette.