strv backend go net
v0.8.0
Paket GO memfasilitasi aplikasi API penulisan dengan cepat dan mudah.
Definisi kesalahan umum.
Fungsionalitas umum yang berguna terlepas dari arsitektur API yang digunakan. net saat ini mendukung ID permintaan menghasilkan beberapa metode pembantu.
Pembungkus di sekitar GO Asli HTTP Server. http mendefinisikan Server yang dapat dikonfigurasi oleh ServerConfig . Fitur yang diimplementasikan:
Run .Server dapat dikonfigurasi dengan slog.logger untuk mencatat informasi penting selama awal/akhir server.Server mendengarkan sinyal SIGINT dan SIGTERM sehingga dapat dihentikan dengan menembakkan sinyal.ServerConfig dapat dikonfigurasi fungsi yang harus dipanggil sebelum Server berakhir. http mendefinisikan beberapa konstruksi pembantu:
RequestIDMiddleware menetapkan ID permintaan ke dalam konteks.RecoverMiddleware pulih dari panik dan atur objek panik ke dalam penulis respons untuk logging.LoggingMiddleware Log Informasi tentang permintaan (metode, jalur, kode status, ID permintaan, durasi permintaan, pesan kesalahan dan pesan panik).WriteResponse untuk menulis respons HTTP dan WriteErrorResponse untuk menulis respons HTTP kesalahan. Penulisan tanggapan dapat dikonfigurasi oleh ResponseOption . Memulai server:
package main
import (
...
httpx "go.strv.io/net/http"
)
func main () {
...
h := slog . NewJSONHandler ( os . Stderr , & slog. HandlerOptions {
Level : level ,
ReplaceAttr : func ( groups [] string , a slog. Attr ) slog. Attr {
if a . Key == slog . TimeKey {
a . Value = slog . StringValue ( a . Value . Time (). Format ( "2006-01-02T15:04:05.000Z" ))
}
return a
},
})
l := slog . New ( h )
serverConfig := httpx. ServerConfig {
Addr : ":8080" ,
Handler : handler (), // define your http handler
Hooks : httpx. ServerHooks {
BeforeShutdown : []httpx. ServerHookFunc {
func ( _ context. Context ) {
storage . Close () // it may be useful for example to close a storage before the server ends
},
},
},
Limits : nil ,
Logger : l . WithGroup ( "httpx.Server" ), // the server expects *slog.Logger
}
server := httpx . NewServer ( & serverConfig )
if err = server . Start ( ctx ); err != nil {
l . Error ( "HTTP server unexpectedly ended" , slog . Any ( "error" , err ))
}
}Menulis tanggapan HTTP:
func ( h * Handler ) GetUser ( w http. ResponseWriter , r * http. Request ) {
userID := userIDFromCtx ( r . Context ())
user , err := h . service . GetUser ( r . Context (), userID )
if err != nil {
_ = httpx . WriteErrorResponse ( w , http . StatusInternalServerError , httpx . WithErrorCode ( "ERR_UNKNOWN" ))
return
}
userResp := model . ToUser ( user )
_ = httpx . WriteResponse ( w , userResp , http . StatusOK )
}