handler.go 1.9 KB

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