网络相关
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
4.5 KiB

3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
  1. /*
  2. * url functions
  3. */
  4. package network
  5. import (
  6. "bytes"
  7. "crypto/md5"
  8. "encoding/hex"
  9. "encoding/json"
  10. "errors"
  11. "io/ioutil"
  12. "net"
  13. "net/http"
  14. "net/url"
  15. "strconv"
  16. "strings"
  17. "time"
  18. "git.tetele.net/tgo/crypter"
  19. )
  20. /**
  21. * post 请求
  22. */
  23. func FnPost(url, param string) ([]byte, error) {
  24. httpClient := &http.Client{}
  25. req, err := http.NewRequest("POST", url, strings.NewReader(param))
  26. if err != nil {
  27. return []byte(""), err
  28. }
  29. req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //"application/x-www-form-urlencoded"
  30. resp, err := httpClient.Do(req)
  31. if err != nil {
  32. return []byte(""), err
  33. }
  34. defer resp.Body.Close()
  35. body, err := ioutil.ReadAll(resp.Body)
  36. if err != nil {
  37. return []byte(""), err
  38. }
  39. return body, nil
  40. }
  41. /**
  42. * post 请求
  43. */
  44. func PostJson(url string, param []byte, header ...map[string]string) ([]byte, error) {
  45. httpClient := &http.Client{}
  46. req, err := http.NewRequest("POST", url, bytes.NewBuffer(param))
  47. if err != nil {
  48. return []byte(""), err
  49. }
  50. req.Header.Set("Content-Type", "application/json")
  51. if len(header) > 0 {
  52. for _, item := range header {
  53. for k, v := range item {
  54. req.Header[k] = []string{v}
  55. }
  56. }
  57. }
  58. resp, err := httpClient.Do(req)
  59. if err != nil {
  60. return []byte(""), err
  61. }
  62. defer resp.Body.Close()
  63. body, err := ioutil.ReadAll(resp.Body)
  64. if err != nil {
  65. return []byte(""), err
  66. }
  67. return body, nil
  68. }
  69. /**
  70. * post 请求
  71. */
  72. func PostJsonData(url string, param interface{}, header ...map[string]string) ([]byte, error) {
  73. httpClient := &http.Client{}
  74. params, err := json.Marshal(param)
  75. if err != nil {
  76. return []byte(""), err
  77. }
  78. req, err := http.NewRequest("POST", url, bytes.NewBuffer(params))
  79. if err != nil {
  80. return []byte(""), err
  81. }
  82. req.Header.Set("Content-Type", "application/json")
  83. if len(header) > 0 {
  84. for _, item := range header {
  85. for k, v := range item {
  86. req.Header[k] = []string{v}
  87. }
  88. }
  89. }
  90. resp, err := httpClient.Do(req)
  91. if err != nil {
  92. return []byte(""), err
  93. }
  94. defer resp.Body.Close()
  95. body, err := ioutil.ReadAll(resp.Body)
  96. if err != nil {
  97. return []byte(""), err
  98. }
  99. return body, nil
  100. }
  101. /**
  102. * 取本地IP
  103. */
  104. func GetLocalIp() string {
  105. addrs, err := net.InterfaceAddrs()
  106. if err != nil {
  107. return ""
  108. }
  109. for _, address := range addrs {
  110. // 检查ip地址判断是否回环地址
  111. if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  112. if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() {
  113. return ipnet.IP.String()
  114. }
  115. }
  116. }
  117. return ""
  118. }
  119. /**
  120. * 生成一个token
  121. */
  122. func CreateTokenWithTime(sToken string) string {
  123. now := time.Now()
  124. iNow := now.Format("20060102150405")
  125. sToken += iNow
  126. h := md5.New()
  127. h.Write([]byte(sToken)) // 需要加密的字符串
  128. cipher2Str := h.Sum(nil)
  129. return hex.EncodeToString(cipher2Str) // 输出加密结果
  130. }
  131. /**
  132. * 生成一个token
  133. */
  134. // func CreateToken(sToken string) string {
  135. // now := time.Now()
  136. // iNow := now.Format("20060102150405")
  137. // sToken += iNow
  138. // h := md5.New()
  139. // h.Write([]byte(sToken)) // 需要加密的字符串
  140. // cipher2Str := h.Sum(nil)
  141. // sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果
  142. // tokenEn := crypter.DesEn(sToken, "gzyc8642")
  143. // return sMd5 + "|" + ToString(now.Unix()) + "|" + tokenEn
  144. // }
  145. /**
  146. * 验证token
  147. */
  148. func CheckToken(token string) (bool, string) {
  149. arr := strings.Split(token, "|")
  150. if len(arr) != 3 {
  151. return false, ""
  152. }
  153. tokenDes := crypter.DesDe(arr[2], "gzyc8642")
  154. tokenTime := tokenDes[len(tokenDes)-14:]
  155. timeInt, err := strconv.ParseInt(arr[1], 10, 64)
  156. if err != nil {
  157. return false, ""
  158. }
  159. currentTime := time.Unix(timeInt, 0).Format("20060102150405")
  160. if currentTime != tokenTime {
  161. return false, ""
  162. }
  163. h := md5.New()
  164. h.Write([]byte(tokenDes)) // 需要加密的字符串
  165. cipher2Str := h.Sum(nil)
  166. sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果
  167. if sMd5 == arr[0] {
  168. return true, tokenDes[0 : len(tokenDes)-14]
  169. }
  170. return false, ""
  171. }
  172. /**
  173. * 给参数签名
  174. */
  175. func QuerySign(mQuery map[string]string) string {
  176. sParam := ""
  177. for k, v := range mQuery {
  178. sParam += k + "=" + v + "&"
  179. }
  180. query, Err := url.ParseQuery(sParam)
  181. if Err != nil {
  182. return ""
  183. } else {
  184. return crypter.Md5Password(query.Encode(), "guzeng1")
  185. }
  186. }
  187. /**
  188. * 从url中取域名端口
  189. * 2019/05/20
  190. */
  191. func GetIpPortFromUrl(sUrl string) (string, string, error) {
  192. if sUrl == "" {
  193. return "", "", errors.New("param error")
  194. }
  195. if !strings.Contains(sUrl, "http://") && !strings.Contains(sUrl, "https://") {
  196. sUrl = "http://" + sUrl
  197. }
  198. u, err := url.Parse(sUrl)
  199. if err != nil {
  200. return "", "", err
  201. }
  202. return u.Hostname(), u.Port(), nil
  203. }