handler.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package swagger_api
  2. import (
  3. "embed"
  4. "encoding/json"
  5. "net/http"
  6. "net/url"
  7. "github.com/go-kratos/kratos/v2/api/metadata"
  8. "github.com/go-kratos/kratos/v2/transport/http/binding"
  9. "github.com/gorilla/mux"
  10. )
  11. //go:embed q/swagger-ui/*
  12. var staticFS embed.FS
  13. func NewHandler(servicesList []string) http.Handler {
  14. service := New(nil)
  15. r := mux.NewRouter()
  16. r.HandleFunc("/q/services", func(w http.ResponseWriter, r *http.Request) {
  17. if len(servicesList) > 0 {
  18. w.Header().Set("Content-Type", "application/json")
  19. w.WriteHeader(200)
  20. reply := map[string][]string{
  21. "services": servicesList,
  22. }
  23. json.NewEncoder(w).Encode(reply)
  24. } else {
  25. services, err := service.ListServices(r.Context(), &metadata.ListServicesRequest{})
  26. if err != nil {
  27. w.WriteHeader(500)
  28. w.Write([]byte(err.Error()))
  29. return
  30. }
  31. w.Header().Set("Content-Type", "application/json")
  32. w.WriteHeader(200)
  33. json.NewEncoder(w).Encode(services)
  34. }
  35. }).Methods("GET")
  36. r.HandleFunc("/q/service/{name}", func(w http.ResponseWriter, r *http.Request) {
  37. raws := mux.Vars(r)
  38. vars := make(url.Values, len(raws))
  39. for k, v := range raws {
  40. vars[k] = []string{v}
  41. }
  42. var in metadata.GetServiceDescRequest
  43. if err := binding.BindQuery(vars, &in); err != nil {
  44. w.WriteHeader(400)
  45. w.Write([]byte(err.Error()))
  46. return
  47. }
  48. content, err := service.GetServiceOpenAPI(r.Context(), &in, false)
  49. if err != nil {
  50. w.WriteHeader(500)
  51. w.Write([]byte(err.Error()))
  52. return
  53. }
  54. w.Header().Set("Content-Type", "application/json")
  55. w.WriteHeader(200)
  56. w.Write([]byte(content))
  57. }).Methods("GET")
  58. staticServer := http.FileServer(http.FS(staticFS))
  59. sh := http.StripPrefix("", staticServer)
  60. //r.Handle("/q/swagger-ui/", sh)
  61. r.PathPrefix("/q/swagger-ui").Handler(sh)
  62. return r
  63. }