fwhHttpClient.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package fwh_pro
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fwh-toolbox-server/config"
  6. "fwh-toolbox-server/domain"
  7. "fwh-toolbox-server/utils/httpClient"
  8. "net/http"
  9. "net/url"
  10. "time"
  11. )
  12. const (
  13. timeout time.Duration = 3 * time.Minute // fwh请求超时3min
  14. )
  15. var (
  16. fwhEnergy string
  17. fwhOss string
  18. fwhUser string
  19. fwhPassword string
  20. fwhTotpSecret string
  21. fwhTotpField string
  22. fwhHttpClient httpClient.HttpClient
  23. )
  24. // FwhHttpInit
  25. func FwhHttpInit(cfg *config.FwhApiConfig) {
  26. fwhEnergy = cfg.FwhEnergy
  27. fwhOss = cfg.FwhOss
  28. fwhUser = cfg.FwhUser
  29. fwhPassword = cfg.FwhPassword
  30. fwhTotpSecret = cfg.FwhTotpSecret
  31. fwhTotpField = cfg.FwhTotpField
  32. fwhHttpClient = httpClient.HttpClient{}
  33. fwhHttpClient.RegisterLogin(reLogin)
  34. }
  35. // 获取完整EnergyURL
  36. func getFullEnergyUrl(relativeURL string) string {
  37. return "https://" + fwhEnergy + relativeURL
  38. }
  39. // 获取完整OssURL
  40. func getFullOssUrl(relativeURL string) string {
  41. // return "https://" + fwhOss + relativeURL
  42. return "https://" + fwhEnergy + relativeURL
  43. }
  44. // 仅用户登录或者不需要token的请求
  45. func FwhHttpGetWithoutToken(url string, params url.Values) (*httpClient.Response, error) {
  46. t := timeout / time.Second
  47. opt := httpClient.HttpClientOptions{
  48. Timeout: &t,
  49. Header: &http.Header{
  50. "Accept": {"application/json", "text/plain", "*/*"},
  51. },
  52. }
  53. return fwhHttpClient.HttpGet(url, &params, &opt)
  54. }
  55. func FwhHttpGet(url string, params url.Values) (*httpClient.Response, error) {
  56. t := timeout / time.Second
  57. opt := httpClient.HttpClientOptions{
  58. Timeout: &t,
  59. Header: &http.Header{
  60. "Logintoken": {getLoginToken()},
  61. "Accept": {"application/json", "text/plain", "*/*"},
  62. },
  63. }
  64. return fwhHttpClient.HttpGet(url, &params, &opt)
  65. }
  66. func FwhHttpGetContext(ctx context.Context, url string, params url.Values) (*httpClient.Response, error) {
  67. t := timeout / time.Second
  68. opt := httpClient.HttpClientOptions{
  69. Timeout: &t,
  70. Context: ctx,
  71. Header: &http.Header{
  72. "Logintoken": {getLoginToken()},
  73. "Accept": {"application/json", "text/plain", "*/*"},
  74. },
  75. }
  76. return fwhHttpClient.HttpGet(url, &params, &opt)
  77. }
  78. // 仅用户登录或者不需要token的请求
  79. func FwhHttpPostWithoutToken(url string, body any) (*httpClient.Response, error) {
  80. t := timeout / time.Second
  81. opt := httpClient.HttpClientOptions{
  82. Timeout: &t,
  83. Header: &http.Header{
  84. "Accept": {"application/json", "text/plain", "*/*"},
  85. },
  86. }
  87. return fwhHttpClient.HttpPost(url, body, &opt)
  88. }
  89. func FwhHttpPost(url string, body any) (*httpClient.Response, error) {
  90. t := timeout / time.Second
  91. opt := httpClient.HttpClientOptions{
  92. Timeout: &t,
  93. Header: &http.Header{
  94. "Logintoken": {getLoginToken()},
  95. "Accept": {"application/json", "text/plain", "*/*"},
  96. },
  97. }
  98. return fwhHttpClient.HttpPost(url, body, &opt)
  99. }
  100. func FwhHttpPostContext(ctx context.Context, url string, body any) (*httpClient.Response, error) {
  101. t := timeout / time.Second
  102. opt := httpClient.HttpClientOptions{
  103. Timeout: &t,
  104. Context: ctx,
  105. Header: &http.Header{
  106. "Logintoken": {getLoginToken()},
  107. "Accept": {"application/json", "text/plain", "*/*"},
  108. },
  109. }
  110. return fwhHttpClient.HttpPost(url, body, &opt)
  111. }
  112. func FwhHttpGetUnmarshalContext[T any](ctx context.Context, url string, params url.Values) (*domain.FwhResponse[T], error) {
  113. for attempt := 0; attempt < 2; attempt++ {
  114. res, err := FwhHttpGetContext(ctx, url, params)
  115. if err != nil {
  116. return nil, err
  117. }
  118. var data domain.FwhResponse[T]
  119. if err := json.Unmarshal(res.Body, &data); err != nil {
  120. return nil, err
  121. }
  122. if data.Code != 401 || attempt == 1 {
  123. return &data, nil
  124. }
  125. reLogin()
  126. }
  127. return nil, ctx.Err()
  128. }
  129. func FwhHttpPostUnmarshalContext[T any](ctx context.Context, url string, body any) (*domain.FwhResponse[T], error) {
  130. for attempt := 0; attempt < 2; attempt++ {
  131. res, err := FwhHttpPostContext(ctx, url, body)
  132. if err != nil {
  133. return nil, err
  134. }
  135. var data domain.FwhResponse[T]
  136. if err := json.Unmarshal(res.Body, &data); err != nil {
  137. return nil, err
  138. }
  139. if data.Code != 401 || attempt == 1 {
  140. return &data, nil
  141. }
  142. reLogin()
  143. }
  144. return nil, ctx.Err()
  145. }
  146. /************ 实现标准结构体解析 ************/
  147. func FwhHttpGetUnmarshal[T any](url string, params url.Values) (*domain.FwhResponse[T], error) {
  148. res, err := FwhHttpGet(url, params)
  149. if err != nil {
  150. return nil, err
  151. }
  152. var data domain.FwhResponse[T]
  153. // 反序列化(unmarshal)
  154. jsonErr := json.Unmarshal(res.Body, &data)
  155. if jsonErr != nil {
  156. return nil, jsonErr
  157. }
  158. if data.Code == 401 {
  159. // invalid token
  160. reLogin() // 重新登录
  161. // 重新请求
  162. res, err := FwhHttpGet(url, params)
  163. if err != nil {
  164. return nil, err
  165. }
  166. // 反序列化(unmarshal)
  167. jsonErr := json.Unmarshal(res.Body, &data)
  168. if jsonErr != nil {
  169. return nil, jsonErr
  170. }
  171. }
  172. return &data, nil
  173. }
  174. func FwhHttpGetUnmarshalPage[T any](url string, params url.Values) (*domain.FwhPageResponse[T], error) {
  175. res, err := FwhHttpGet(url, params)
  176. if err != nil {
  177. return nil, err
  178. }
  179. var data domain.FwhPageResponse[T]
  180. // 反序列化(unmarshal)
  181. jsonErr := json.Unmarshal(res.Body, &data)
  182. if jsonErr != nil {
  183. return nil, jsonErr
  184. }
  185. if data.Code == 401 {
  186. // invalid token
  187. reLogin() // 重新登录
  188. // 重新请求
  189. res, err := FwhHttpGet(url, params)
  190. if err != nil {
  191. return nil, err
  192. }
  193. // 反序列化(unmarshal)
  194. jsonErr := json.Unmarshal(res.Body, &data)
  195. if jsonErr != nil {
  196. return nil, jsonErr
  197. }
  198. }
  199. return &data, nil
  200. }
  201. func FwhHttpGetUnmarshalA[T any](url string, params url.Values) (*domain.FwhResponseA[T], error) {
  202. res, err := FwhHttpGet(url, params)
  203. if err != nil {
  204. return nil, err
  205. }
  206. var data domain.FwhResponseA[T]
  207. // 反序列化(unmarshal)
  208. jsonErr := json.Unmarshal(res.Body, &data)
  209. if jsonErr != nil {
  210. return nil, jsonErr
  211. }
  212. if data.Code == 401 {
  213. // invalid token
  214. reLogin() // 重新登录
  215. // 重新请求
  216. res, err := FwhHttpGet(url, params)
  217. if err != nil {
  218. return nil, err
  219. }
  220. // 反序列化(unmarshal)
  221. jsonErr := json.Unmarshal(res.Body, &data)
  222. if jsonErr != nil {
  223. return nil, jsonErr
  224. }
  225. }
  226. return &data, nil
  227. }
  228. func FwhHttpGetUnmarshalB[T any](url string, params url.Values) (*domain.FwhResponseB[T], error) {
  229. res, err := FwhHttpGet(url, params)
  230. if err != nil {
  231. return nil, err
  232. }
  233. var data domain.FwhResponseB[T]
  234. // 反序列化(unmarshal)
  235. jsonErr := json.Unmarshal(res.Body, &data)
  236. if jsonErr != nil {
  237. return nil, jsonErr
  238. }
  239. if data.Code == 401 {
  240. // invalid token
  241. reLogin() // 重新登录
  242. // 重新请求
  243. res, err := FwhHttpGet(url, params)
  244. if err != nil {
  245. return nil, err
  246. }
  247. // 反序列化(unmarshal)
  248. jsonErr := json.Unmarshal(res.Body, &data)
  249. if jsonErr != nil {
  250. return nil, jsonErr
  251. }
  252. }
  253. return &data, nil
  254. }
  255. func FwhHttpPostUnmarshal[T any](url string, body any) (*domain.FwhResponse[T], error) {
  256. res, err := FwhHttpPost(url, body)
  257. if err != nil {
  258. return nil, err
  259. }
  260. var data domain.FwhResponse[T]
  261. // 反序列化(unmarshal)
  262. jsonErr := json.Unmarshal(res.Body, &data)
  263. if jsonErr != nil {
  264. return nil, jsonErr
  265. }
  266. if data.Code == 401 {
  267. // invalid token
  268. reLogin() // 重新登录
  269. // 重新请求
  270. res, err := FwhHttpPost(url, body)
  271. if err != nil {
  272. return nil, err
  273. }
  274. // 反序列化(unmarshal)
  275. jsonErr := json.Unmarshal(res.Body, &data)
  276. if jsonErr != nil {
  277. return nil, jsonErr
  278. }
  279. }
  280. return &data, nil
  281. }
  282. func FwhHttpPostUnmarshalPage[T any](url string, body any) (*domain.FwhPageResponse[T], error) {
  283. res, err := FwhHttpPost(url, body)
  284. if err != nil {
  285. return nil, err
  286. }
  287. var data domain.FwhPageResponse[T]
  288. // 反序列化(unmarshal)
  289. jsonErr := json.Unmarshal(res.Body, &data)
  290. if jsonErr != nil {
  291. return nil, jsonErr
  292. }
  293. if data.Code == 401 {
  294. // invalid token
  295. reLogin() // 重新登录
  296. // 重新请求
  297. res, err := FwhHttpPost(url, body)
  298. if err != nil {
  299. return nil, err
  300. }
  301. // 反序列化(unmarshal)
  302. jsonErr := json.Unmarshal(res.Body, &data)
  303. if jsonErr != nil {
  304. return nil, jsonErr
  305. }
  306. }
  307. return &data, nil
  308. }