1.服务器:响应客户端的请求
法1:
package main
import (
"log"
"net/http"
)
type server int
func (h *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Path)
w.Write([]byte("Hello World!"))
}
func main() {
var s server
http.ListenAndServe("localhost:9999", &s)
}
1)主函数:调用 http.ListenAndServe
func ListenAndServe(address string, h Handler) error
第一个参数:表示在 9999 端口启动 http 服务,服务器在本地的此端口监听
第二个参数:代表处理HTTP请求的实例,类型时Handler。
nil 代表使用标准库中的实例处理请求,上面的代码处理请求的对象为 s server
2)Handler是什么?是一个接口
任何实现了此接口中方法的类型,都可以作为ListenAndServe的第二个参数
type Handler interface {
ServeHTTP(w ResponseWriter, r *Request)
}
第一个参数 响应:ResponseWriter ,利用 ResponseWriter 构造对请求的响应内容。发送给客户端的响应是 ResponseWriter对象
响应报文分为三部分:https://laravelacademy.org/post/21659
状态行:包含了 HTTP 协议版本和响应状态码,200 OK 表示响应成功
响应头:包含了 HTTP 响应的首部字段,比如内容类型/编码、缓存控制、Cookie 信息等
响应实体:返回的 XML/JSON 格式数据,对与 HTML 视图响应,就是一个标准的 HTML 文档
type ResponseWriter interface {
// 用于设置响应状态码
WriteHeader(statusCode int)
// 用于设置/获取所有响应头信息
Header() Header
// 用于写入数据到响应实体
Write([]byte) (int, error)
}
第二个参数 请求:*Request ,客户端请求信息都封装到了 Request 对象,该对象包含了该HTTP请求的所有的信息,比如请求地址、Header和Body等信息。
法2:
注册路由:
在web开发中,路由(route)是指根据url分配到对应的处理程序
func main() {
http.HandleFunc("/", indexHandler)
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":9999", nil))
}
// handler echoes r.URL.Path
func indexHandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "URL.Path = %q\n", req.URL.Path)
}
// handler echoes r.URL.Header
func helloHandler(w http.ResponseWriter, req *http.Request) {
for k, v := range req.Header {
fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
}
}
2.客户端 net/url
url.QueryEscape: 将字符串转义,以便它可以安全地放置在 URL 查询中
查询字符串是URL的一部分,其中包含可以传递给Web应用程序的数据。该数据需要进行编码,并且使用url.QueryEscape进行编码
http.Get()
//基本的GET请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
resp, err := http.Get("http://httpbin.org/get")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
fmt.Println(resp.StatusCode)
if resp.StatusCode == 200 {
fmt.Println("ok")
}
}