文章插图
如下所示,使用一个swagger endpoint定义输入,生成了很多代码,这对于HTTP服务器的实现是节省了时间的 。
下面使用Swagger编辑main.go文件:
package mainimport ("log""github.com/go-openapi/loads""github.com/scraly/http-go-server/pkg/swagger/server/restapi""github.com/scraly/http-go-server/pkg/swagger/server/restapi/operations")func main{// Initialize SwaggerswaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "")if err != nil {log.Fatalln(err)}api := operations.NewHelloAPI(swaggerSpec)server := restapi.NewServer(api)defer server.Shutdownserver.Port = 8080// Start listening using having the handlers and port// already set up.if err := server.Serve; err != nil {log.Fatalln(err)}}
现在启动服务:$ go run internal/main.go2019/10/28 14:27:26 Serving hello at http://[::]:8080
现在我们可以做几个测试:$ curl localhost:8080{"code":404,"message":"path / was not found"}%$ curl localhost:8080/hello{"code":404,"message":"path /hello was not found"}%$ curl localhost:8080/hello/aurelie"operation GetHelloUser has not yet been implemented"
完美,我们的HTTP服务正在应答,甚至告知我们GetHelloUser接口尚未实现,接下来实现它吧!编辑main.go文件如下所示:
package mainimport ("log""github.com/go-openapi/loads""github.com/go-openapi/runtime/middleware""github.com/scraly/http-go-server/pkg/swagger/server/restapi""github.com/scraly/http-go-server/pkg/swagger/server/restapi/operations")func main{// Initialize SwaggerswaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "")if err != nil {log.Fatalln(err)}api := operations.NewHelloAPI(swaggerSpec)server := restapi.NewServer(api)defer func{if err := server.Shutdown; err != nil {// error handlelog.Fatalln(err)}}server.Port = 8080// Implement the CheckHealth handlerapi.CheckHealthHandler = operations.CheckHealthHandlerFunc(func(user operations.CheckHealthParams) middleware.Responder {return operations.NewCheckHealthOK.WithPayload("OK")})// Implement the GetHelloUser handlerapi.GetHelloUserHandler = operations.GetHelloUserHandlerFunc(func(user operations.GetHelloUserParams) middleware.Responder {return operations.NewGetHelloUserOK.WithPayload("Hello " + user.User + "!")})// Start server which listeningif err := server.Serve; err != nil {log.Fatalln(err)}}
再来一次,我们重启服务:$ go run internal/main.go2019/10/28 21:45:38 Serving hello at http://[::]:8080$ curl localhost:8080/hello/aurelie"Hello aurelie!"$ curl localhost:8080/healthzOK%
很好,我们有一个遵守OpenAPI规范的HTTP服务和两个路由:- GET/healthz
- GET/hello/{name}
我们将在main.go文件(在文件末尾)中,为路由实现增加新函数 。
//Health route returns OKfunc Health(operations.CheckHealthParams) middleware.Responder {return operations.NewCheckHealthOK.WithPayload("OK")}//GetHelloUser returns Hello + your namefunc GetHelloUser(user operations.GetHelloUserParams) middleware.Responder {return operations.NewGetHelloUserOK.WithPayload("Hello " + user.User + "!")}
现在我们只需在主函数中调用这些新函数:func main{// Initialize SwaggerswaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "")if err != nil {log.Fatalln(err)}api := operations.NewHelloAPI(swaggerSpec)server := restapi.NewServer(api)defer func{if err := server.Shutdown; err != nil {// error handlelog.Fatalln(err)}}server.Port = 8080api.CheckHealthHandler = operations.CheckHealthHandlerFunc(Health)api.GetHelloUserHandler = operations.GetHelloUserHandlerFunc(GetHelloUser)// Start server which listeningif err := server.Serve; err != nil {log.Fatalln(err)}}
和之前一样,我们测试静态测试是否通过,以及我们应用是否构建:$ make lint.full==> linters (slow)INFO [config_reader] Config search paths: [./ /Users/uidn3817/git/github.com/scraly/http-go-server/internal /Users/uidn3817/git/github.com/scraly/http-go-server /Users/uidn3817/git/github.com/scraly /Users/uidn3817/git/github.com /Users/uidn3817/git /Users/uidn3817 /Users /]INFO [config_reader] Used config file .golangci.ymlINFO [lintersdb] Active 13 linters: [deadcode errcheck goimports golint govet ineffassign maligned misspell nakedret structcheck typecheck unconvert varcheck]INFO [loader] Go packages loading at mode load types and syntax took 1.474090863sINFO [loader] SSA repr building timing: packages building 15.964643ms, total 220.705097msINFO [runner] worker.4 took 652.824µs with stages: deadcode: 244.82µs, unconvert: 110.42µs, errcheck: 102.565µs, varcheck: 81.099µs, structcheck: 38.623µs, maligned: 34.263µs, nakedret: 22.825µs, typecheck: 5.339µsINFO [runner] worker.6 took 1.883µsINFO [runner] worker.8 took 2.125µsINFO [runner] worker.5 took 1.040528ms with stages: ineffassign: 1.035173msINFO [runner] worker.7 took 3.211184ms with stages: goimports: 3.2029msINFO [runner] worker.3 took 102.06494ms with stages: misspell: 102.056568msINFO [runner] worker.1 took 120.104406ms with stages: golint: 120.096599msINFO [runner] worker.2 took 204.48169ms with stages: govet: 204.471908msINFO [runner] Workers idle times: #1: 84.514968ms, #3: 86.547645ms, #4: 203.167851ms, #5: 202.957443ms, #6: 203.09743ms, #7: 201.160969ms, #8: 202.973757msINFO [runner] processing took 18.697µs with stages: max_same_issues: 14.808µs, skip_dirs: 737ns, cgo: 498ns, nolint: 420ns, filename_unadjuster: 398ns, max_from_linter: 281ns, autogenerated_exclude: 172ns, path_prettifier: 170ns, identifier_marker: 167ns, diff: 164ns, skip_files: 161ns, replacement_builder: 158ns, exclude: 156ns, source_code: 90ns, max_per_file_from_linter: 81ns, path_shortener: 79ns, uniq_by_line: 79ns, exclude-rules: 78nsINFO File cache stats: 0 entries of total size 0BINFO Memory: 24 samples, avg is 248.1MB, max is 671.8MBINFO Execution took 2.277787079s
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SEO中,H1、H2、H3标签应该如何使用?
- 如何添加 Photoshop 的各类工具
- 腰骶神经根损伤如何治疗
- 腰麻后神经损伤如何治疗
- 扁导体发炎了怎么办
- 屁股为什么会变大
- 如何判断结膜炎的类型
- 淘宝开店如何装修 淘宝店铺不装修可以吗
- 驻马店,茶园建设如火如荼 茶业发展正逢时
- 皎然,皎如明月 灿然似星