handler.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. reply := map[string][]string{
  28. "services": servicesList,
  29. }
  30. json.NewEncoder(w).Encode(reply)
  31. } else {
  32. services, err := service.ListServices(r.Context(), &metadata.ListServicesRequest{})
  33. if err != nil {
  34. w.WriteHeader(500)
  35. w.Write([]byte(err.Error()))
  36. return
  37. }
  38. w.Header().Set("Content-Type", "application/json")
  39. w.WriteHeader(200)
  40. json.NewEncoder(w).Encode(services)
  41. }
  42. }).Methods("GET")
  43. r.HandleFunc("/q/service/{name}", func(w http.ResponseWriter, r *http.Request) {
  44. raws := mux.Vars(r)
  45. vars := make(url.Values, len(raws))
  46. for k, v := range raws {
  47. vars[k] = []string{v}
  48. }
  49. var in metadata.GetServiceDescRequest
  50. if err := binding.BindQuery(vars, &in); err != nil {
  51. w.WriteHeader(400)
  52. w.Write([]byte(err.Error()))
  53. return
  54. }
  55. content, err := service.GetServiceOpenAPI(r.Context(), &in, false)
  56. if err != nil {
  57. w.WriteHeader(500)
  58. w.Write([]byte(err.Error()))
  59. return
  60. }
  61. w.Header().Set("Content-Type", "application/json")
  62. w.WriteHeader(200)
  63. w.Write([]byte(content))
  64. }).Methods("GET")
  65. statikFS, err := fs.New()
  66. if err != nil {
  67. panic(err)
  68. }
  69. staticServer := http.FileServer(statikFS)
  70. sh := http.StripPrefix("/q/swagger-ui", staticServer)
  71. r.PathPrefix("/q/swagger-ui").Handler(sh)
  72. return r
  73. }