实现了get、post方法
package http
import (
"io/ioutil"
"net/http"
"net"
"time"
"bytes"
// "strings"
"mime/multipart"
"fmt"
)
func transport() (tr *http.Transport) {
return &http.Transport{
Dial: func(netw, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(netw, addr, time.Second * 3) //设置建立连接超时
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(time.Second * 3)) //设置发送接受数据超时
return conn, nil
},
ResponseHeaderTimeout: time.Second * 3,
}
}
func Get(url string) ([]byte, interface{}) {
client := &http.Client{Transport: transport()}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("NewRequest", url, err)
return nil, err
}
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36")
resp, err := client.Do(req)
// fmt.Printf("%+v\n", resp)
if err != nil || resp.StatusCode != 200 {
fmt.Println("Do", url, err)
return nil, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return body, nil
}
func PostRaw(url string, data string) ([]byte, error) {
client := &http.Client{Transport: transport()}
// fmt.Printf("%+v\n", FormData(data))
req, err := http.NewRequest("POST", url, strings.NewReader(data))
// req, err := http.NewRequest("POST", url, bd)
if err != nil {
fmt.Println("NewRequest", url, err)
return []byte{}, err
}
// req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := client.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return body, err
}
func PostForm(url string, data map[string]string) (string, error) {
client := &http.Client{Transport: transport()}
// fmt.Printf("%+v\n", FormData(data))
bd := &bytes.Buffer{}
writer := multipart.NewWriter(bd)
for k,v := range data {
_ = writer.WriteField(k, v)
}
writer.Close()
// req, err := http.NewRequest("POST", url, strings.NewReader(BuildQuery(data)))
req, err := http.NewRequest("POST", url, bd)
if err != nil {
fmt.Println("NewRequest", url, err)
return "", err
}
req.Header.Set("Content-Type", writer.FormDataContentType()) //生成multipart/form-data; boundary=xxx
resp, err := client.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return string(body), err
}
func BuildQuery(data map[string]string) string {
query := ""
for k,v := range data {
if len(query) > 0 {
query += "&"
}
query += k + "=" + v
}
fmt.Printf("%+v\n", query)
return query
}
const upperhex = "0123456789ABCDEF"
func UrlEncode(bytes []byte) string {
buf := make([]byte, len(bytes)*3)
i := 0
for _, v := range bytes {
buf[i] = '%'
buf[i+1] = upperhex[v>>4]
buf[i+2] = upperhex[v&15]
i += 3
}
return string(buf)
}
var h = []string{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
// 性能差,已废弃
// func UrlEncode(bytes []byte) string {
// str := ""
// for _,v := range bytes {
// str += "%" + fmt.Sprintf("%02s", conv10to16(int(v), 16))
// }
// return str
// }
func conv10to16(n, num int) string {
result := ""
for ; n > 0; n /= num {
lsb := h[n%num]
result = lsb + result
}
return result
}
import (
"io/ioutil"
"net/http"
"net"
"time"
"bytes"
// "strings"
"mime/multipart"
"fmt"
)
func transport() (tr *http.Transport) {
return &http.Transport{
Dial: func(netw, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(netw, addr, time.Second * 3) //设置建立连接超时
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(time.Second * 3)) //设置发送接受数据超时
return conn, nil
},
ResponseHeaderTimeout: time.Second * 3,
}
}
func Get(url string) ([]byte, interface{}) {
client := &http.Client{Transport: transport()}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("NewRequest", url, err)
return nil, err
}
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36")
resp, err := client.Do(req)
// fmt.Printf("%+v\n", resp)
if err != nil || resp.StatusCode != 200 {
fmt.Println("Do", url, err)
return nil, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return body, nil
}
func PostRaw(url string, data string) ([]byte, error) {
client := &http.Client{Transport: transport()}
// fmt.Printf("%+v\n", FormData(data))
req, err := http.NewRequest("POST", url, strings.NewReader(data))
// req, err := http.NewRequest("POST", url, bd)
if err != nil {
fmt.Println("NewRequest", url, err)
return []byte{}, err
}
// req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := client.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return body, err
}
func PostForm(url string, data map[string]string) (string, error) {
client := &http.Client{Transport: transport()}
// fmt.Printf("%+v\n", FormData(data))
bd := &bytes.Buffer{}
writer := multipart.NewWriter(bd)
for k,v := range data {
_ = writer.WriteField(k, v)
}
writer.Close()
// req, err := http.NewRequest("POST", url, strings.NewReader(BuildQuery(data)))
req, err := http.NewRequest("POST", url, bd)
if err != nil {
fmt.Println("NewRequest", url, err)
return "", err
}
req.Header.Set("Content-Type", writer.FormDataContentType()) //生成multipart/form-data; boundary=xxx
resp, err := client.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
return string(body), err
}
func BuildQuery(data map[string]string) string {
query := ""
for k,v := range data {
if len(query) > 0 {
query += "&"
}
query += k + "=" + v
}
fmt.Printf("%+v\n", query)
return query
}
const upperhex = "0123456789ABCDEF"
func UrlEncode(bytes []byte) string {
buf := make([]byte, len(bytes)*3)
i := 0
for _, v := range bytes {
buf[i] = '%'
buf[i+1] = upperhex[v>>4]
buf[i+2] = upperhex[v&15]
i += 3
}
return string(buf)
}
var h = []string{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
// 性能差,已废弃
// func UrlEncode(bytes []byte) string {
// str := ""
// for _,v := range bytes {
// str += "%" + fmt.Sprintf("%02s", conv10to16(int(v), 16))
// }
// return str
// }
func conv10to16(n, num int) string {
result := ""
for ; n > 0; n /= num {
lsb := h[n%num]
result = lsb + result
}
return result
}
转载请注明:小Y » go语言http客户端