有一種說法,golang 編寫的 API 不能像其他語言那樣簡單和通用。但實際上,我遇到很多 REST API 的代碼,非常多的抽象,使得代碼庫變得混亂和復(fù)雜,最終傷害了可讀性和可維護性。
這一系列,我們將通過如何建立一個產(chǎn)品級的 REST API TODO 列表,一個可持續(xù)擴展架構(gòu),從路由和代碼接口開始,然后添加一個 mongo 的數(shù)據(jù)庫和一個 badger 數(shù)據(jù)層,然后是授權(quán)協(xié)議層(OAuth 2.0)
在這一系列中我們將使用 chi 路由。
為什么選擇用 Chi ,而不是用標(biāo)準(zhǔn)庫或者 Gin 或者 router-x 進行路由?
嗯,其實選擇用什么并不重要。無論你使用什么來進行路由,本系列中討論的概念都將是有用的。但是有下面的這些優(yōu)點可以讓我認(rèn)為 Chi-router 比大多數(shù)替代方案更優(yōu)越:
和
net/http
標(biāo)準(zhǔn)庫 100% 兼容---可以在 Go 生態(tài)系統(tǒng)中使用任何與net / http 兼容的 http 或中間件 pkg專為模塊化/可組合 API 設(shè)計 - 中間件,內(nèi)聯(lián)中間件,路由組和子路由器安裝
沒有外部依賴---純粹的就是 Go 1.7+ stdlib + net / http
強悍?---?有很多公司正在使用,比如:Pressly,CloudFlare,Heroku,99Designs
輕量級?---?cloc'd in ~1000 LOC for the chi router
速度很快
我最喜歡的是,你為其他 net / http 兼容路由器編寫的舊的 http 處理程序和中間件也可以在正常運行。
讓我們開始吧
首先,我們創(chuàng)建一個 main.go 。我們程序的基礎(chǔ)(或者說中心元件 ?)
上面的代碼是一些最佳實踐的重點
- 用一個單獨的包來實現(xiàn)路由的邏輯,并將它們分好組,然后安裝(mount) 它們:
r.Mount("/api/todo", todo.Routes())
- 給 API 打上版本,這樣你就可以對 api 進行更新時,不會破壞舊的客戶端:
router.Route("/v1", ....)
- 使用中間件作為擴展。使用了非常多路由的代碼是非常笨重的,其實可以變成鏈接的中間件,像:授權(quán),設(shè)置響應(yīng)頭部,壓縮,請求日志,限速等。
筆者(基于 Ajinkya?在評論中提到的問題,我會更多的闡述 walk 方法):
chi 路由有一個方法叫做 walk。這個方法接收的參數(shù):
A router
A callback.
每個被定義的路由都會被回調(diào),并且接收 4 個參數(shù):
路由定義的方法
實際路由的字符串
處理器(函數(shù)),處理給定路由的請求
給定路由中,定義過的中間件列表(中間件是一個比較簡單的函數(shù),它會在處理器被調(diào)用前調(diào)用,所以它們才會被使用在請求處理之前,授權(quán)等)
以我為例,我將簡單地輪詢路由并且打印所有被定義的路由。從而讓我對所有可用的路由一目了然。
接下來我們構(gòu)建一個 todo 包,它實際上保存了我們 todo 邏輯。
注意事項
todo 包有一個返回所有路由的方法。這些路由都是寫在 main.go 文件中。 實際上我通常會把這些路由寫在一個叫 routes.go 的文件中,?這樣會很容易在包里找到.
處理程序具有?
func (w http.ResponseWriter,r *http.Request)?
的函數(shù)簽名,這意味著這處理程序和你使用標(biāo)準(zhǔn)庫的 net/http 寫法沒有不同。使用 render.JSON,一個 encoding/json 的封裝, 它會自動轉(zhuǎn)義你 JSON 響應(yīng)中所有的 html,并設(shè)置 content-type 為 application/json
你被它有多簡單嚇到了嗎?可以在 GitHub 上查看這個項目?https://github.com/tonyalaribe/todoapi/tre....
在我們本系列的下篇文章中, 我們會繼續(xù)對配置和共享狀態(tài)的支持。 大多數(shù)項目通常都需要額外的配置,例如數(shù)據(jù)庫連接,等等。 我們將會在下篇文章里討論這個。
推薦教程:《Go教程》
Atas ialah kandungan terperinci 優(yōu)雅的實現(xiàn) Golang REST API 架構(gòu). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Jawapannya ialah: Permohonan GO tidak mempunyai susun atur projek wajib, tetapi masyarakat umumnya mengamalkan struktur standard untuk meningkatkan kebolehpercayaan dan skalabilitas. 1.CMD/menyimpan pintu masuk program, setiap subdirektori sepadan dengan fail yang boleh dilaksanakan, seperti CMD/MYAPP/MAIN.GO; 2. Kod Swasta/ Kedai, tidak boleh diimport oleh modul luaran, dan digunakan untuk merangkum logik dan perkhidmatan perniagaan; 3.PKG/ Kedai Perpustakaan yang boleh digunakan semula secara terbuka untuk mengimport projek lain; 4.API/ Pilihan menyimpan OpenAPI, Protobuf dan fail definisi API lain; 5.Config/, skrip/, dan fail konfigurasi web/kedai, skrip dan sumber web masing -masing; 6. direktori akar mengandungi go.mod dan go.sum

Menggunakan bufio.scanner adalah kaedah yang paling biasa dan efisien dalam GO untuk membaca fail mengikut baris, dan sesuai untuk mengendalikan senario seperti fail besar, fail parsing log atau konfigurasi. 1. Buka fail menggunakan os.open dan pastikan untuk menutup fail melalui deferfile.close (). 2. Buat contoh pengimbas melalui bufio.newscanner. 3. Panggilan Scanner.scan () dalam gelung untuk membaca garis demi baris sehingga palsu dikembalikan untuk menunjukkan bahawa akhir fail dicapai atau ralat berlaku. 4. Gunakan Scanner.Text () untuk mendapatkan kandungan baris semasa (tidak termasuk aksara baru). 5. Semak Scanner.err () selepas gelung selesai untuk menangkap kesilapan baca yang mungkin. Kaedah ini mempunyai kesan ingatan

Routing dalam aplikasi GO bergantung kepada kerumitan projek. 1. Perpustakaan standard Net/HttpserveMux sesuai untuk aplikasi mudah, tanpa kebergantungan luaran dan ringan, tetapi tidak menyokong parameter URL dan pemadanan lanjutan; 2. Router pihak ketiga seperti CHI menyediakan middleware, parameter laluan dan penghalaan bersarang, yang sesuai untuk reka bentuk modular; 3. Gin mempunyai prestasi yang sangat baik, pemprosesan JSON terbina dalam dan fungsi yang kaya, yang sesuai untuk API dan microservices. Ia harus dipilih berdasarkan sama ada fleksibiliti, prestasi atau integrasi berfungsi diperlukan. Projek -projek kecil menggunakan perpustakaan standard, projek sederhana dan besar mengesyorkan CHI atau GIN, dan akhirnya mencapai pengembangan yang lancar dari mudah ke kompleks.

Pakej bendera Go dengan mudah boleh menghuraikan parameter baris arahan. 1. Gunakan flag.type () untuk menentukan bendera jenis seperti rentetan, integer, dan boolean; 2. Anda boleh menghuraikan bendera kepada pembolehubah melalui flag.typevar () untuk mengelakkan operasi penunjuk; 3. Selepas memanggil flag.parse (), gunakan flag.args () untuk mendapatkan parameter kedudukan berikutnya; 4. Melaksanakan Bendera. Antara muka nilai boleh menyokong jenis tersuai untuk memenuhi keperluan CLI yang paling mudah. Senario kompleks boleh digantikan oleh perpustakaan SPF13/COBRA.

Kenyataan IF-ELSE di GO tidak memerlukan kurungan tetapi mesti menggunakan pendakap keriting. Ia menyokong permulaan pembolehubah dalam jika menghadkan skop. Keadaan boleh dinilai melalui rantai lain, yang sering digunakan untuk pemeriksaan ralat. Gabungan pengisytiharan dan syarat pembolehubah dapat meningkatkan kesederhanaan dan keselamatan kod.

Di Go, pemalar diisytiharkan menggunakan kata kunci Const, dan nilai tidak dapat diubah, dan tidak boleh jenis atau jenis; 1. Satu perisytiharan tetap seperti Constpi = 3.14159; 2. Pelbagai deklarasi malar di blok adalah seperti const (pi = 3.14159; bahasa = "go"; iscool = true); 3. Pemalar jenis eksplisit seperti ConstSecondSinMinuteInt = 60; 4. Gunakan IOTA untuk menjana nilai penghitungan, seperti Const (Ahad = IOTA; Isnin; Selasa) akan memberikan nilai 0, 1, dan 2 dalam urutan, dan IOTA boleh digunakan untuk ungkapan seperti operasi bit; Pemalar mesti menentukan nilai pada masa penyusunan,

Gorun adalah arahan untuk menyusun dan melaksanakan program GO dengan cepat. 1. Ia melengkapkan kompilasi dan berjalan dalam satu langkah, menghasilkan fail yang boleh dilaksanakan sementara dan memadamnya selepas program selesai; 2. Ia sesuai untuk program bebas yang mengandungi fungsi utama, yang mudah dibangunkan dan diuji; 3. Ia menyokong operasi pelbagai fail, dan boleh dilaksanakan melalui Gorun*.go atau menyenaraikan semua fail; 4. Ia secara automatik memproses kebergantungan dan menggunakan sistem modul untuk menghuraikan pakej luaran; 5. Ia tidak sesuai untuk perpustakaan atau pakej, dan tidak menjana fail binari yang berterusan. Oleh itu, ia sesuai untuk ujian pesat semasa skrip, pembelajaran dan pengubahsuaian yang kerap. Ia adalah cara yang cekap dan ringkas.

Untuk menyambung ke pangkalan data SQL di GO, anda perlu menggunakan pakej pangkalan data/SQL dan pemacu pangkalan data tertentu. 1. Pakej dan Pemacu Pangkalan Data/SQL Import (seperti github.com/go-sql-driver/mysql), perhatikan bahawa menggariskan sebelum pemandu menunjukkan bahawa ia hanya digunakan untuk permulaan; 2. Gunakan sql.open ("mysql", "pengguna: kata laluan@tcp (localhost: 3306)/dbName") untuk membuat pemegang pangkalan data, dan hubungi db.ping () untuk mengesahkan sambungan; 3. Gunakan db.query () untuk melaksanakan pertanyaan, dan db.exec () untuk melaksanakan
