网络相关
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

/*
* url functions
*/
package network
import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/json"
"errors"
"io/ioutil"
"net"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"git.tetele.net/tgo/crypter"
)
/**
* post 请求
*/
func FnPost(url, param string) ([]byte, error) {
httpClient := &http.Client{}
req, err := http.NewRequest("POST", url, strings.NewReader(param))
if err != nil {
return []byte(""), err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //"application/x-www-form-urlencoded"
resp, err := httpClient.Do(req)
if err != nil {
return []byte(""), err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte(""), err
}
return body, nil
}
/**
* post 请求
*/
func PostJson(url string, param []byte, header ...map[string]string) ([]byte, error) {
httpClient := &http.Client{}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(param))
if err != nil {
return []byte(""), err
}
req.Header.Set("Content-Type", "application/json")
if len(header) > 0 {
for _, item := range header {
for k, v := range item {
req.Header[k] = []string{v}
}
}
}
resp, err := httpClient.Do(req)
if err != nil {
return []byte(""), err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte(""), err
}
return body, nil
}
/**
* post 请求
*/
func PostJsonData(url string, param interface{}, header ...map[string]string) ([]byte, error) {
httpClient := &http.Client{}
params, err := json.Marshal(param)
if err != nil {
return []byte(""), err
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(params))
if err != nil {
return []byte(""), err
}
req.Header.Set("Content-Type", "application/json")
if len(header) > 0 {
for _, item := range header {
for k, v := range item {
req.Header[k] = []string{v}
}
}
}
resp, err := httpClient.Do(req)
if err != nil {
return []byte(""), err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte(""), err
}
return body, nil
}
/**
* 取本地IP
*/
func GetLocalIp() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
// 检查ip地址判断是否回环地址
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() {
return ipnet.IP.String()
}
}
}
return ""
}
/**
* 生成一个token
*/
func CreateTokenWithTime(sToken string) string {
now := time.Now()
iNow := now.Format("20060102150405")
sToken += iNow
h := md5.New()
h.Write([]byte(sToken)) // 需要加密的字符串
cipher2Str := h.Sum(nil)
return hex.EncodeToString(cipher2Str) // 输出加密结果
}
/**
* 生成一个token
*/
// func CreateToken(sToken string) string {
// now := time.Now()
// iNow := now.Format("20060102150405")
// sToken += iNow
// h := md5.New()
// h.Write([]byte(sToken)) // 需要加密的字符串
// cipher2Str := h.Sum(nil)
// sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果
// tokenEn := crypter.DesEn(sToken, "gzyc8642")
// return sMd5 + "|" + ToString(now.Unix()) + "|" + tokenEn
// }
/**
* 验证token
*/
func CheckToken(token string) (bool, string) {
arr := strings.Split(token, "|")
if len(arr) != 3 {
return false, ""
}
tokenDes := crypter.DesDe(arr[2], "gzyc8642")
tokenTime := tokenDes[len(tokenDes)-14:]
timeInt, err := strconv.ParseInt(arr[1], 10, 64)
if err != nil {
return false, ""
}
currentTime := time.Unix(timeInt, 0).Format("20060102150405")
if currentTime != tokenTime {
return false, ""
}
h := md5.New()
h.Write([]byte(tokenDes)) // 需要加密的字符串
cipher2Str := h.Sum(nil)
sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果
if sMd5 == arr[0] {
return true, tokenDes[0 : len(tokenDes)-14]
}
return false, ""
}
/**
* 给参数签名
*/
func QuerySign(mQuery map[string]string) string {
sParam := ""
for k, v := range mQuery {
sParam += k + "=" + v + "&"
}
query, Err := url.ParseQuery(sParam)
if Err != nil {
return ""
} else {
return crypter.Md5Password(query.Encode(), "guzeng1")
}
}
/**
* 从url中取域名,端口
* 2019/05/20
*/
func GetIpPortFromUrl(sUrl string) (string, string, error) {
if sUrl == "" {
return "", "", errors.New("param error")
}
if !strings.Contains(sUrl, "http://") && !strings.Contains(sUrl, "https://") {
sUrl = "http://" + sUrl
}
u, err := url.Parse(sUrl)
if err != nil {
return "", "", err
}
return u.Hostname(), u.Port(), nil
}