Curl- go的自带包 net/http实现
case
http
包中的Request
发送请求的步骤:1. 创建客户端 2. 发送请求 3. 接受响应
client := &http.Client{}
req, _ := http.NewRequest("POST", url, nil)
// request中有很多参数可以设置
//设置头部
req.Header.set(key,value)
//接受响应
resp,_ := client.Do(req)
http.NewRequest
// NewRequest wraps NewRequestWithContext using context.Background.
func NewRequest(method, url string, body io.Reader) (*Request, error) {
return NewRequestWithContext(context.Background(), method, url, body)
}
- method
- get,post,delete,put
- url
- body :可以是多种形式的数据包含在请求体中
我们可以看出这个 : body
是一个io.Reader
所以Request
的请求体就是字节流。所以制定编码方式-》用header
指定
multipart/form-data 表单方式提交,上传文件
application/x-www-form-urlencoded url编码方式提交
application/json json数据格式提交
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
接下来就可以往body里放字节流数据
import uri "net/url"
fromData := uri.Values{}
for k, v := range data {
fromData.Set(k, v)
}
req, _ := http.NewRequest("POST", url, strings.NewReader(fromData.Encode()))
Post Get Delete Put
都可以根据这个模版魔改
client := &http.Client{}
req, _ := http.NewRequest("POST", url, nil)
// request中有很多参数可以设置
//设置头部
req.Header.set(key,value)
//接受响应
resp,_ := client.Do(req)
例如:from-data
的post:
func PostWithFromData(url string, headers map[string]string, data map[string]string) []byte {
jar, _ := cookiejar.New(nil) // 客户端带cookie,这里没用到
client := &http.Client{
Jar: jar,
}
fromData := uri.Values{}
for k, v := range data {
fromData.Set(k, v)
}
req, _ := http.NewRequest("POST", url, strings.NewReader(fromData.Encode()))
for key, value := range headers {
req.Header.Set(key, value)
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {
fmt.Println("发送请求失败:", err)
return nil
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
return body
}