目录
前言
Go原生支持http,直接使用import("net/http")即可,http服务性能和nginx非常接近,都具备高并发支持的能力,代码实现起来比较简单。
1、服务器配置
package main
import (
"fmt"
"net/http"
)
//HTTP服务端配置
//业务请求相应处理
func hello(res http.ResponseWriter, req *http.Request) {
fmt.Println("hello")
fmt.Fprintln(res, "<h1>welcome</h1>")
}
func main() {
//路由到指定站点位置跳转相关函数处理
http.HandleFunc("/", hello)
err := http.ListenAndServe("127.0.0.1:8088", nil)
if err != nil {
fmt.Println("启动监听失败,err:", err)
return
}
}
启动服务端
这时候用浏览器验证
2、客户端配置
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
//http客户端配置
func main() {
/*
http.Get()
传入值为 url,是string类型
返回值有两个,
一个是请求,结构体类型,该结构体的Body字段是一个接口
第二个是err
*/
//在Get函数中,放入完整合格域名(FQDN)
res, err := http.Get("https://www.baidu.com/")
if err != nil {
fmt.Println("获取信息失败,err:", err)
return
}
/*
接收 io.reader,这是一个接口
返回字节切片和 err
*/
//response结构体中读取信息
buf, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println("读取信息失败,err:", err)
return
}
fmt.Println(string(buf))
}
运行客户端
3、请求方法
Get请求:提交的数据都是追加在URL之后,限制点是URL的长度不能超过8K,不适用于提交量大的数据,适用于请求数据,get请求从服务器中读取资源,以明文形式发送请求。
Post请求:数据存放在包中,数据量不受限制,可以提交上传量大的数据信息,post用于更新服务器资源。
Put请求:用于在服务器上创建资源。
Delete请求:用户在服务器上删除资源。
Head请求:向服务器请求头部信息,用于监控服务状态。
示例:
package main
import (
"fmt"
"net/http"
)
//请求头部信息
var url []string = []string{
"https://www.baidu.com/",
"https://www.taobao.com/",
"https://www.google.com/",
}
func main() {
for _, v := range url {
req, err := http.Head(v)
if err != nil {
fmt.Println("获取请求失败,err", err)
return
}
fmt.Printf("来自%s的网站,状态是%s\n", v, req.Status)
}
}
运行结果为
使用自建客户端进行超时时间优化
package main
import (
"fmt"
"net"
"net/http"
"time"
)
//请求头部信息
var url []string = []string{
"https://www.baidu.com/",
"https://www.taobao.com/",
"https://www.google.com/",
}
func main() {
for _, v := range url {
//自建client做测试,优化超时时间
client := http.Client{
Transport: &http.Transport{
//连接服务端
Dial: func(network, addr string) (net.Conn, error) {
//设置超时时间2秒
timeout := time.Second * 2
return net.DialTimeout(network, addr, timeout)
},
},
}
//使用自建客户端测试
req, err := client.Head(v)
if err != nil {
fmt.Println("获取请求失败,err", err)
return
}
fmt.Printf("来自%s的网站,状态是%s\n", v, req.Status)
}
}
再次运行结果为