handler.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package openapiv2
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/url"
  6. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/generator"
  7. "github.com/go-kratos/kratos/v2/api/metadata"
  8. "github.com/go-kratos/kratos/v2/transport/http/binding"
  9. _ "github.com/go-kratos/swagger-api/openapiv2/swagger_ui/statik" // import statik static files
  10. "github.com/gorilla/mux"
  11. "github.com/rakyll/statik/fs"
  12. )
  13. func NewHandler(servicesList []string, handlerOpts ...HandlerOption) http.Handler {
  14. opts := &options{
  15. // Compatible with default UseJSONNamesForFields is true
  16. generatorOptions: []generator.Option{generator.UseJSONNamesForFields(true)},
  17. }
  18. for _, o := range handlerOpts {
  19. o(opts)
  20. }
  21. service := New(nil, opts.generatorOptions...)
  22. r := mux.NewRouter()
  23. r.HandleFunc("/q/services", func(w http.ResponseWriter, r *http.Request) {
  24. if len(servicesList) > 0 {
  25. w.Header().Set("Content-Type", "application/json")
  26. w.WriteHeader(200)
  27. list := []string{
  28. "api.kuban.Kuban",
  29. }
  30. reply := map[string][]string{
  31. "services": list,
  32. }
  33. json.NewEncoder(w).Encode(reply)
  34. } else {
  35. services, err := service.ListServices(r.Context(), &metadata.ListServicesRequest{})
  36. if err != nil {
  37. w.WriteHeader(500)
  38. w.Write([]byte(err.Error()))
  39. return
  40. }
  41. w.Header().Set("Content-Type", "application/json")
  42. w.WriteHeader(200)
  43. json.NewEncoder(w).Encode(services)
  44. }
  45. }).Methods("GET")
  46. r.HandleFunc("/q/service/{name}", func(w http.ResponseWriter, r *http.Request) {
  47. raws := mux.Vars(r)
  48. vars := make(url.Values, len(raws))
  49. for k, v := range raws {
  50. vars[k] = []string{v}
  51. }
  52. var in metadata.GetServiceDescRequest
  53. if err := binding.BindQuery(vars, &in); err != nil {
  54. w.WriteHeader(400)
  55. w.Write([]byte(err.Error()))
  56. return
  57. }
  58. content, err := service.GetServiceOpenAPI(r.Context(), &in, false)
  59. if err != nil {
  60. w.WriteHeader(500)
  61. w.Write([]byte(err.Error()))
  62. return
  63. }
  64. w.Header().Set("Content-Type", "application/json")
  65. w.WriteHeader(200)
  66. w.Write([]byte(content))
  67. }).Methods("GET")
  68. statikFS, err := fs.New()
  69. if err != nil {
  70. panic(err)
  71. }
  72. staticServer := http.FileServer(statikFS)
  73. sh := http.StripPrefix("/q/swagger-ui", staticServer)
  74. r.PathPrefix("/q/swagger-ui").Handler(sh)
  75. return r
  76. }