fwhHttpClient.go 8.3 KB

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