package tools
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net"
"net/http"
"net/url"
"os"
"strconv"
"strings"
"time"
)
func Get(url string, authinfo ...string) (interface{}, error) {
timeout := time.Duration(5 * time.Second)
client := &http.Client{Timeout: timeout}
req, reqerr := http.NewRequest("GET", url, nil)
if reqerr != nil {
fmt.Println(url)
return nil, reqerr
}
if len(authinfo) > 0 && authinfo[0] != "" {
req.Header.Set("Authorization", authinfo[0])
}
result, httperr := client.Do(req)
//defer result.Body.Close()
if httperr != nil {
fmt.Println(url)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func Post(url string, data interface{}, authinfo ...string) (interface{}, error) {
timeout := time.Duration(5 * time.Second)
client := &http.Client{Timeout: timeout}
req, reqerr := http.NewRequest("POST", url, strings.NewReader(data.(string)))
if reqerr != nil {
return nil, reqerr
}
if len(authinfo) > 0 && authinfo[0] != "" {
req.Header.Set("Authorization", authinfo[0])
//req.Header.Set("Content-Type", "application/json;charset=utf-8")
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
result, httperr := client.Do(req)
//defer result.Body.Close()
if httperr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func PostJson(url string, data interface{}, authinfo ...string) (interface{}, error) {
timeout := time.Duration(5 * time.Second)
client := &http.Client{Timeout: timeout}
req, reqerr := http.NewRequest("POST", url, strings.NewReader(data.(string)))
if reqerr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, reqerr
}
if len(authinfo) > 0 && authinfo[0] != "" {
req.Header.Set("Authorization", authinfo[0])
//
}
req.Header.Set("Content-Type", "application/json;charset=utf-8")
result, httperr := client.Do(req)
//defer result.Body.Close()
if httperr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func PostRaw(url string, data interface{}) (interface{}, error) {
result, httperr := http.Post(url, "text/plain;charset=utf-8", strings.NewReader(data.(string)))
if httperr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func PostForm(url string, data url.Values, authinfo ...string) (interface{}, error) {
timeout := time.Duration(5 * time.Second)
client := &http.Client{Timeout: timeout}
req, reqerr := http.NewRequest("POST", url, strings.NewReader(data.Encode()))
if reqerr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, reqerr
}
if len(authinfo) > 0 && authinfo[0] != "" {
req.Header.Set("Authorization", authinfo[0])
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
result, httperr := client.Do(req)
//defer result.Body.Close()
if httperr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func PostRawBasicAuth(url string, data interface{}, user string, pwd string) (interface{}, error) {
client := http.Client{
Transport: &http.Transport{
Dial: func(netw, addr string) (net.Conn, error) {
c, err := net.DialTimeout(netw, addr, time.Second*5)
if err != nil {
fmt.Println("dail timeout", err)
return nil, err
}
return c, nil
},
MaxIdleConnsPerHost: 10,
ResponseHeaderTimeout: time.Second * 5,
},
}
req, _ := http.NewRequest("POST", url, strings.NewReader(data.(string)))
req.SetBasicAuth(user, pwd)
req.Header.Set("Content-Type", "text/plain;charset=utf-8")
result, httperr := client.Do(req)
//result, httperr := http.Post(url, "text/plain;charset=utf-8", strings.NewReader(data.(string)))
if httperr != nil {
fmt.Println(url)
fmt.Println(data)
return nil, httperr
}
body, err := ioutil.ReadAll(result.Body)
if err != nil {
return nil, err
}
result.Close = true
return returnBody(body)
}
func Put(url string, data interface{}) (interface{}, error) {
req, httperr := http.NewRequest("PUT", url, strings.NewReader(data.(string)))
if httperr != nil {
return nil, httperr
}
res, httperr := http.DefaultClient.Do(req)
if httperr != nil {
return nil, httperr
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
res.Close = true
return returnBody(body)
}
func Delete(url string) (interface{}, error) {
req, httperr := http.NewRequest("DELETE", url, nil)
//req.Header.Add("Authorization", "5F6MJ3N2Tk9ruL_6XQpx-uxkkg:o56-nIwtgTzUX80YCNpbcjUL8iM=:eyJyZXNvdXJjZSI6IF9mbG93RGF0YVNvdXJjZTEiLCJleHBpcmVzIjoxNTM2NzU4ODE2LCJjb250ZW50TUQ1IjoiIiwiY29udGVudFR5cGUiOiIiLCJoZWFkZXJzIjoiIiwibWV0aG9kIjoiREVMRVRFIn0=")
if httperr != nil {
return nil, httperr
}
res, httperr := http.DefaultClient.Do(req)
if httperr != nil {
return nil, httperr
}
body, httperr := ioutil.ReadAll(res.Body)
if httperr != nil {
return nil, httperr
}
res.Close = true
return returnBody(body)
}
func PostFile(targetUrl string, filename string, filed string) (interface{}, error) {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
//关键的一步操作
fileWriter, err := bodyWriter.CreateFormFile(filed, filename)
if err != nil {
fmt.Println("error writing to buffer")
return nil, err
}
//打开文件句柄操作
fh, err := os.Open(filename)
if err != nil {
fmt.Println("error opening file")
return nil, err
}
defer fh.Close()
//iocopy
_, err = io.Copy(fileWriter, fh)
if err != nil {
return nil, err
}
contentType := bodyWriter.FormDataContentType()
bodyWriter.Close()
resp, err := http.Post(targetUrl, contentType, bodyBuf)
if err != nil {
return nil, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
resp.Close = true
return returnBody(body)
}
func Soap11(url string, databody string) (interface{}, error) {
reqBody := `
` + databody + `
`
res, err := http.Post(url, "text/xml; charset=UTF-8", strings.NewReader(reqBody))
if nil != err {
fmt.Println("http post err:", err)
return nil, err
}
defer res.Body.Close()
// return status
if http.StatusOK != res.StatusCode {
fmt.Println("WebService soap1.1 request fail, status: %s\n", res.StatusCode)
return strconv.Itoa(http.StatusOK), nil
}
data, err := ioutil.ReadAll(res.Body)
if nil != err {
fmt.Println("ioutil ReadAll err:", err)
return nil, err
}
return string(data), nil
}
func Soap12(url string, databody string) (interface{}, error) {
reqBody := `
` + databody + `
`
res, err := http.Post(url, "application/soap+xml; charset=UTF-8", strings.NewReader(reqBody))
if nil != err {
fmt.Println("http post err:", err)
return nil, err
}
defer res.Body.Close()
// return status
if http.StatusOK != res.StatusCode {
fmt.Println("WebService soap1.1 request fail, status: %s\n", res.StatusCode)
return strconv.Itoa(http.StatusOK), nil
}
data, err := ioutil.ReadAll(res.Body)
if nil != err {
fmt.Println("ioutil ReadAll err:", err)
return nil, err
}
return string(data), nil
}
func returnBody(body []byte) (interface{}, error) {
if len(body) == 0 {
return "", nil
}
jsonStr := string(body)
firstChar := jsonStr[0:1]
if firstChar == "[" || firstChar == "{" {
jsondata := make(map[string]interface{})
newStr := `{"a":` + jsonStr + `}`
err := json.Unmarshal([]byte(newStr), &jsondata)
if err != nil {
return jsonStr, err
}
return jsondata["a"], nil
} else {
return jsonStr, nil
}
}