http协议基于Tcp/ip协议;区别在于Tcp是面向连接的,而http是短连接,一次请求对用一次回应
服务端
http的开启方式1:
func f1(w http.ResponseWriter, r *http.Request) {
n, err := ioutil.ReadFile("./home.html")
if err != nil {
w.Write([]byte("页面丢失了!"))
}
w.Write(n)
}
//模拟客户端请求;同浏览器
func f2(w http.ResponseWriter, r *http.Request) {
queryMap := r.URL.Query()
fmt.Println(queryMap) //自动识别请求URl中的参数 并以map形式展示
fmt.Println(queryMap["name"])
fmt.Println(queryMap["age"])
fmt.Println(r.Method)
fmt.Println(ioutil.ReadAll(r.Body)) //在服务端打印客户端发送的请求的body
w.Write([]byte("hello"))
}
//启动http服务的方式1
func main() {
http.HandleFunc("/home", f1)
http.HandleFunc("/simulation/", f2)
http.ListenAndServe("0.0.0.0:9090", nil) //监听并服务于指定的IP和端口;
}
http的开启方式2:
type myHandleType struct{
addr string
}
func new()*myHandleType{
return &myHandleType{
addr: "0.0.0.0:9090",
}
}
//实现这个ServerHTTP这个方法从而实现http.Handler这个接口类
func (m *myHandleType)ServeHTTP(rsp http.ResponseWriter, req *http.Request){
if req.URL.Path=="/v1" {
httpCode:=http.StatusOK
text := http.StatusText(httpCode)
fmt.Println("200",text)
rsp.Write([]byte("hello!"))
return
}
}
func main(){
w:=new()
//http是基于tcp/Ip协议的,所以首先开启监听
listener, err := net.Listen("tcp", w.addr)
if err != nil {
fmt.Println("net listen failed:",err)
return
}
//启动http服务
err = http.Serve(listener, w)
if err != nil {
fmt.Println("http serve failed:",err)
return
}
}
客户端
请求示例1:请求的query无法编译
func main() {
//get请求示例1;对于get的提交的query值无法编译
resp, err := http.Get("http://127.0.0.1:9090/simulation?name=铁柱&id=123")
if err != nil {
fmt.Println("get request failed err:", err)
return
}
}
请求示例2:对请求的query进行编译
func main() {
//get请求示例2;对get的提交的query值编译 和自定义
var urlObj, _ = url.Parse("http://127.0.0.1:9090/simulation/")
var urlData = url.Values{} //url map 可以对其编码
urlData.Set("name", "铁柱")
urlData.Set("age", "123")
queryStr := urlData.Encode() //编码后的url 地址
fmt.Println(queryStr)
urlObj.RawQuery = queryStr
req, err := http.NewRequest("get", urlObj.String(), nil)
resp, err := http.DefaultClient.Do(req) //发送请求
if err != nil {
fmt.Println("send request failed;err:", err)
}
defer resp.Body.Close() //resp.Body 一定要关闭
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("read response failed err:", err)
return
}
fmt.Println(string(b))
}