HTTP客户端和服务端
HTTP客户端就是浏览器,而服务端就是后台服务器
HTTP协议规定了浏览器和网站服务器之间通信的规则,HTML通过标签符号为页面增添元素,CSS就是为了形成不同的颜色样式来渲染页面,JS是一种在浏览器上执行的编程语言,定义了页面上的动作。
package main
// http server
import (
"fmt"
"io/ioutil"
"net/http"
)
// Request中包含了客户端请求的所有内容,Response则是返回给客户端的内容
func f1(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadFile("./xx.html")
if err != nil {
w.Write([]byte("发生错误:" + fmt.Sprintf("%v", err)))
}
w.Write(b)
}
func f2(w http.ResponseWriter, r *http.Request) {
// 读取客户端发来的请求信息
// 对于GET请求,参数都放在URL上,请求body里是没有数据的
fmt.Println(r.URL)
// 自动识别URL中的参数
fmt.Println(r.URL.Query())
queryParam := r.URL.Query()
name := queryParam.Get("name")
age := queryParam.Get("age")
fmt.Println(name, age)
fmt.Println(r.Method)
fmt.Println(ioutil.ReadAll(r.Body))
w.Write([]byte("ok"))
}
func main() {
// 访问这个路径就执行f1函数
http.HandleFunc("/hello", f1)
http.HandleFunc("/xxx", f2)
http.ListenAndServe("127.0.0.1:9090", nil)
}
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
// http Client
func main() {
// 直接通过地址请求数据
// resp, err := http.Get("http://127.0.0.1:9090/xxx?name=kaka&age=18")
// if err != nil {
// fmt.Printf("get url failed,err:%v\n", err)
// return
// }
// 通过编码转义,多用于将中文编码,自定义其中的参数然后来发起请求
data := url.Values{} //本质还是map
urlObj, _ := url.Parse("http://127.0.0.1:9090/xxx")
data.Set("name", "卡卡")
data.Set("age", "18")
queryStr := data.Encode() //URL Encode之后的URL
urlObj.RawQuery = queryStr
fmt.Println(queryStr)
// 建立请求
req, _ := http.NewRequest("GET", urlObj.String(), nil)
// 执行请求并获得回复
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Printf("get url failed,err:%v\n", err)
return
}
// 等价于下方代码
// resp, err := http.Get(urlObj.String())
// if err != nil {
// fmt.Printf("get url failed,err:%v\n", err)
// }
// response一定要记得关闭
// 当请求并不是很频繁时,希望用完就关闭链接,可以建立短连接减少资源消耗
// tr := &http.Transport{
// DisableKeepAlives: true,
// }
// client := http.Client{
// Transport: tr,
// }
// resp, err := client.Do(req)
// if err != nil {
// fmt.Printf("get url failed,err:%v\n", err)
// return
// }
defer resp.Body.Close()
// 从resp中将服务端返回的body数据读出来
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("read resp.Body failed,err:%v\n", err)
return
}
fmt.Println(string(b))
}