เริ่มจากเพิ่งได้เครื่อง Nintendo Switch มาเล่น เลยลองหา API มาเขียนเล่นสักหน่อย ซึ่งใน Store พวก App จำพวก หาเกมส์ลดราคา มันก็มีใช้งานกันอยู่แล้ว แต่เราพอเขียน โปรแกรมได้บ้าง ก็ทำมาใช้เองซะเลยดีกว่า
เริ่มจากไปหา ก่อนว่า Eshop มันมี API ให้ใช้หรือเปล่า จนไปเจอ https://gist.github.com/Shy07 พบว่ามี API ให้ใช้งานบางส่วน แยกเป็นเกมส์ลดราคาแต่ละประเทศ พร้อมสกุลเงินในประเทศนั้นๆ
โดยจะ Return Data ออกมาดังนี้
Returncontents: arraycontent_type: stringdisclaimer: stringdominant_colors: string[]formal_name: stringhero_banner_url: stringid: numberis_new: booleanpublic_status: stringrelease_date_on_eshop: stringstrong_disclaimer: stringtags: arraytarget_titles: arraylength: numberoffset: numbertotal: number
ต่อมาจะไปสร้าง package ของ golang กัน ตั้งชื่อว่า discount.go
package discount//Country List const iotaconst (JP = iotaUSGBCAAUNZCZDKFIGRHUNOPLZASEDECHFRBEFRITNLBENLRUESMXCOARCLPEPTBRHKKR)
โดยเราจะสร้าง constant expression สำหรับเก็บ Country List ของ api ที่ให้บริการไว้ เป็น iota
และทำการเก็บ api ไว้ตามลำดับ ประเทศในรูปแบบ array
var api = []string{"https://ec.nintendo.com/api/JP/ja/search/sales?count=30&offset=0","https://ec.nintendo.com/api/US/en/search/sales?count=30&offset=0","https://ec.nintendo.com/api/GB/en/search/sales?count=10&offset=0","https://ec.nintendo.com/api/CA/en/search/sales?count=30&offset=0#Canada","https://ec.nintendo.com/api/AU/en/search/sales?count=10&offset=0#Australia","https://ec.nintendo.com/api/NZ/en/search/sales?count=10&offset=0#NewZealand","https://ec.nintendo.com/api/CZ/en/search/sales?count=10&offset=0#Czech","https://ec.nintendo.com/api/DK/en/search/sales?count=10&offset=0#Denmark","https://ec.nintendo.com/api/FI/en/search/sales?count=10&offset=0#Finland","https://ec.nintendo.com/api/GR/en/search/sales?count=10&offset=0#Greece","https://ec.nintendo.com/api/HU/en/search/sales?count=10&offset=0#Hungary","https://ec.nintendo.com/api/NO/en/search/sales?count=10&offset=0#Norway","https://ec.nintendo.com/api/PL/en/search/sales?count=10&offset=0#Poland","https://ec.nintendo.com/api/ZA/en/search/sales?count=10&offset=0#SouthAfrica","https://ec.nintendo.com/api/SE/en/search/sales?count=10&offset=0#Sweden","https://ec.nintendo.com/api/DE/de/search/sales?count=10&offset=0","https://ec.nintendo.com/api/CH/de/search/sales?count=10&offset=0#Switzerland","https://ec.nintendo.com/api/FR/fr/search/sales?count=10&offset=0","https://ec.nintendo.com/api/BE/fr/search/sales?count=10&offset=0#Belgium","https://ec.nintendo.com/api/IT/it/search/sales?count=10&offset=0","https://ec.nintendo.com/api/NL/nl/search/sales?count=10&offset=0","https://ec.nintendo.com/api/BE/nl/search/sales?count=10&offset=0#Belgium","https://ec.nintendo.com/api/RU/ru/search/sales?count=30&offset=0","https://ec.nintendo.com/api/ES/es/search/sales?count=30&offset=0","https://ec.nintendo.com/api/MX/es/search/sales?count=30&offset=0#Mexico","https://ec.nintendo.com/api/CO/es/search/sales?count=10&offset=0#Columbia","https://ec.nintendo.com/api/AR/es/search/sales?count=10&offset=0#Argentina","https://ec.nintendo.com/api/CL/es/search/sales?count=10&offset=0#Chile","https://ec.nintendo.com/api/PE/es/search/sales?count=10&offset=0#Peru","https://ec.nintendo.com/api/PT/pt/search/sales?count=30&offset=0","https://ec.nintendo.com/api/BR/pt/search/sales?count=10&offset=0","https://ec.nintendo.com/api/HK/zh/search/sales?count=10&offset=0","https://ec.nintendo.com/api/KR/ko/search/sales?count=10&offset=0",}
ขั้นต่อไป เราจะทำการเตรียม type structure สำหรับเก็บ return json ที่ได้รับกลับมาจาก API ที่เราเรียกใช้ ซึ่งมี รูปแบบ JSON ดังนี้
{"contents": [{"content_type": "title","dominant_colors": ["1a2221","f5f5f5","e1ad6b"],"formal_name": "Cooking Simulator","hero_banner_url": "https://img-eshop.cdn.nintendo.net/i/030c5fbd8b3477625586063260316456d6686e82e13945db82327e97a2ab2c4f.jpg","id": 70010000024855,"is_new": false,"membership_required": false,"public_status": "public","rating_info": {"content_descriptors": [{"id": 2,"name": "Alcohol Reference","type": "descriptor"}],"rating": {"age": 6,"id": 2,"image_url": "https://img-eshop.cdn.nintendo.net/i/d96122dbb89250582816a67461bf8080f030402720e46032980582bca516778d.jpg","name": "E","provisional": false,"svg_image_url": "https://img-eshop.cdn.nintendo.net/i/46eb70b11307f05cacc1248b54b18a846be5cdf0414c53f620cb663e5bf942a6.svg"},"rating_system": {"id": 202,"name": "ESRB"}},"release_date_on_eshop": "2020-05-14","screenshots": [{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/0d3163cafd75cd621f7c8c05165a078bfc7ae107cc10a45c996029d166746faa.jpg"}]},{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/721f2f505debfd0d5bc83795bddce334637725e9a29ceec35e933eb2fb790c70.jpg"}]},{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/29f6cb94435d445cf05b8f7f941129c4b10fe4a6eaa33ff885506bc090cdc32e.jpg"}]},{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/badc449200fc618595ac0219938a30ba44ac67249b23ba1cc0a20b5c84e89f45.jpg"}]},{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/7a80d3ac5d1fa2d9bc185c7361773815e5b5e3e5bdf7d0158fbe657257dc2d8b.jpg"}]},{"images": [{"url": "https://img-eshop.cdn.nintendo.net/i/c9eb7d42566d4bd2cb0a2d9156c9b5de6b5579d2a1e60f666961d669adb9d24f.jpg"}]}],"tags": [],"target_titles": []}]}
เราจะมาสร้าง Contents Structure กันก่อน
//Contents structtype Contents struct {Contents []Content `json:"contents"`Length int `json:"length"`Offset int `json:"offset"`Total int `json:"total"`}
จากนั้น เราจะมาสร้าง structure Content ในรูปแบบ slice อีกที โดยมีโครงสร้างตามนี้
//Content structtype Content struct {ContentType string `json:"content_type"`DominantColors []string `json:"dominant_colors"`FormalName string `json:"formal_name"`HeroBannerURL string `json:"hero_banner_url"`ID int `json:"id"`IsNew bool `json:"is_new"`MembershipRequired bool `json:"membership_required"`PublicStatus string `json:"public"`RatingInfo RatingInfo `json:"rating_info"`ReleaseDateOnEshop string `json:"release_date_on_eshop"`Screenshots []Images `json:"screenshots"`Tags []string `json:"tags"`TargetTitles []string `json:"target_titles"`}
จากนั้นเราจะค่อยๆไล่ทีเหลือลงไปให้หมด
//RatingInfo structtype RatingInfo struct {ContentDescriptors []ContentDescriptors `json:"content_descriptors"`Rating Rating `json:"rating"`RatingSystem RatingSystem `json:"rating_system"`}//ContentDescriptors structtype ContentDescriptors struct {ID string `json:"id"`ImageURL string `json:"image_url"`Name string `json:"name"`SvgImageURL string `json:"svg_image_url"`Type string `json:"type"`}//Rating structtype Rating struct {Age string `json:"age"`ID string `json:"id"`ImageURL string `json:"image_url"`Name string `json:"name"`Provisional bool `json:"provisional"`SvgImageURL string `json:"svg_image_url"`}// RatingSystem structtype RatingSystem struct {ID string `json:"id"`Name string `json:"name"`}//Images structtype Images struct {Images []URL `json:"images"`}//URL structtype URL struct {URL string `json:"url"`}
จากนั้นเราจะมาสร้าง function GetDiscountGameFrom โดยจะรับ Parameter เป็น Country ตามที่เราประกาศไว้ใน constant expression โดยมีค่าเป็น int และเราอยากได้ JSON ออกมาเป็นโครงสร้างประมาณนี้
{"name": "