request_builder.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package gateway
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-tools/utils/http_client"
  5. "github.com/pkg/errors"
  6. )
  7. type ResponseSuccessCallback func(requestBuilder *RequestBuilder)
  8. type ResponseErrorCallback func(requestBuilder *RequestBuilder, err error)
  9. type BeforeRequestCallback func(requestBuilder *RequestBuilder) error
  10. type RequestResponseCallback func(requestBuilder *RequestBuilder, response *http_client.Response) error
  11. type RequestOption func(options *RequestOptions)
  12. type RequestOptions struct {
  13. beforeRequestCallback BeforeRequestCallback
  14. requestResponseCallback RequestResponseCallback
  15. }
  16. func WithBeforeRequestCallback(callback BeforeRequestCallback) RequestOption {
  17. return func(options *RequestOptions) {
  18. options.beforeRequestCallback = callback
  19. }
  20. }
  21. func WithRequestResponseCallback(callback RequestResponseCallback) RequestOption {
  22. return func(options *RequestOptions) {
  23. options.requestResponseCallback = callback
  24. }
  25. }
  26. type RequestBuilder struct {
  27. c *api.Context
  28. historyRequests []Request
  29. resultMap map[string]any
  30. httpRequest *http_client.Request
  31. params *requestBuilderParams
  32. }
  33. func newRequestBuilder(c *api.Context, httpRequest *http_client.Request) *RequestBuilder {
  34. return &RequestBuilder{
  35. c: c,
  36. historyRequests: make([]Request, 0),
  37. resultMap: make(map[string]any),
  38. httpRequest: httpRequest,
  39. params: newRequestBuilderParams(),
  40. }
  41. }
  42. func (builder *RequestBuilder) Context() *api.Context {
  43. return builder.c
  44. }
  45. func (builder *RequestBuilder) HistoryRequests() []Request {
  46. return builder.historyRequests
  47. }
  48. func (builder *RequestBuilder) GetResultMapValue(key string) any {
  49. return builder.resultMap[key]
  50. }
  51. func (builder *RequestBuilder) SetResultMapValue(key string, value any) {
  52. builder.resultMap[key] = value
  53. }
  54. func (builder *RequestBuilder) Post(request *PostRequest, opts ...RequestOption) *RequestBuilder {
  55. return builder.request(request, opts...)
  56. }
  57. func (builder *RequestBuilder) Delete(request *DeleteRequest, opts ...RequestOption) *RequestBuilder {
  58. return builder.request(request, opts...)
  59. }
  60. func (builder *RequestBuilder) Put(request *PutRequest, opts ...RequestOption) *RequestBuilder {
  61. return builder.request(request, opts...)
  62. }
  63. func (builder *RequestBuilder) Get(request *GetRequest, opts ...RequestOption) *RequestBuilder {
  64. return builder.request(request, opts...)
  65. }
  66. func (builder *RequestBuilder) request(builderRequest Request, opts ...RequestOption) *RequestBuilder {
  67. options := new(RequestOptions)
  68. for _, opt := range opts {
  69. opt(options)
  70. }
  71. builder.params.requestItems = append(builder.params.requestItems, newBuilderRequestItem(builderRequest, options))
  72. return builder
  73. }
  74. func (builder *RequestBuilder) ResponseSuccessCallback(responseSuccessCallback ResponseSuccessCallback) *RequestBuilder {
  75. builder.params.responseSuccessCallback = responseSuccessCallback
  76. return builder
  77. }
  78. func (builder *RequestBuilder) ResponseErrorCallback(responseErrorCallback ResponseErrorCallback) *RequestBuilder {
  79. builder.params.responseErrorCallback = responseErrorCallback
  80. return builder
  81. }
  82. func (builder *RequestBuilder) Request() {
  83. httpRequest := builder.httpRequest
  84. for _, requestItem := range builder.params.requestItems {
  85. if requestItem.options.beforeRequestCallback != nil {
  86. err := requestItem.options.beforeRequestCallback(builder)
  87. if err != nil {
  88. builder.params.responseErrorCallback(builder, errors.New(err.Error()))
  89. return
  90. }
  91. }
  92. requestWithResponse, err := requestItem.builderRequest.Request(builder.c, httpRequest)
  93. if err != nil {
  94. builder.params.responseErrorCallback(builder, errors.New(err.Error()))
  95. return
  96. }
  97. builder.historyRequests = append(builder.historyRequests, requestWithResponse)
  98. if requestItem.options.requestResponseCallback != nil {
  99. err := requestItem.options.requestResponseCallback(builder, requestWithResponse.Response())
  100. if err != nil {
  101. builder.params.responseErrorCallback(builder, errors.New(err.Error()))
  102. return
  103. }
  104. }
  105. }
  106. builder.params.responseSuccessCallback(builder)
  107. }
  108. func (builder *RequestBuilder) ResponseError(err error) {
  109. builder.params.responseErrorCallback(builder, err)
  110. }