最近在做GO服务爬虫发现GO的GET请求和POST请求写起来还挺麻烦,这里放出完整代码,读取数据的时候不使用ioutil.ReadAll(),不符合工程标准。
代码采用了通道的写法可以用来做异步爬虫,在处理网络请求的时候响应交给通道,再交给CPU计算(JS加密),等计算完,再从通道取回数据。(通道不用后记得close(通道))
func getLoginMsg() chan string {
loginUrl := "login.url"
data := []byte("param1=value1¶m2=value2")
response := make(chan string)
go Post(loginUrl, data, response)
return response
}
func Get(url string, response chan string) {
// 创建一个请求
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("GET请求创建失败", err)
response <- ""
return
}
// 设定Cookie(多个cookie就多次调用AddCookie)
req.AddCookie(&http.Cookie{
Name: "cookie-name",
Value: "cookie-value",
})
// 设定请求头(多个header就多次调用Header)
req.Header.Add("header-name", "header-value")
// 创建一个客户端
client := &http.Client{}
// 发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("GET请求发送失败", err)
response <- ""
return
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Println("POST请求关闭失败", err)
response <- ""
return
}
}(resp.Body)
// 读取响应
buf := new(bytes.Buffer)
_, err = io.Copy(buf, resp.Body)
if err != nil {
fmt.Println("GET读取响应失败", err)
response <- ""
return
}
response <- buf.String()
}
func Post(url string, data []byte, response chan string) {
// 创建一个请求
req, err := http.NewRequest("POST", url, bytes.NewBuffer(data))
if err != nil {
fmt.Println("POST请求创建失败", err)
response <- ""
return
}
// 设定请求头(多个header就多次调用Header)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// 创建一个客户端
client := http.Client{}
// 发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("POST请求发送失败", err)
response <- ""
return
}
defer func(body io.ReadCloser) {
err := body.Close()
if err != nil {
fmt.Println("POST请求关闭失败", err)
response <- ""
return
}
}(resp.Body)
// 读取响应
buf := new(bytes.Buffer)
_, err = io.Copy(buf, resp.Body)
if err != nil {
fmt.Println("POST读取响应失败", err)
response <- ""
return
}
response <- buf.String()
}