最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Go HTTP编程

来源:博客园


【资料图】

目录
  • HTTP 服务端
  • HTTP客户端

Go 语言标准库内建提供了 net/http 包,涵盖了 HTTP 客户端和服务端的具体实现,使得我们可以很方便地编写 HTTP 客户端或服务端的程序。

HTTP 服务端

示例:

package mainimport (    "fmt"    "net/http")//服务端编写的业务逻辑处理程序 —— 回调函数func myHandler(w http.ResponseWriter, r *http.Request) {    fmt.Println("method = ", r.Method) //请求方法    fmt.Println("URL = ", r.URL)       // 浏览器发送请求文件路径    fmt.Println("header = ", r.Header) // 请求头    fmt.Println("body = ", r.Body)     // 请求包体    fmt.Println(r.RemoteAddr, "连接成功")  //客户端网络地址    w.Write([]byte("hello http")) //给客户端回复数据}func main() {    http.HandleFunc("/hello", myHandler) // 注册处理函数    //该方法用于在指定的 TCP 网络地址 addr 进行监听,然后调用服务端处理程序来处理传入的连接请求。    //该方法有两个参数:第一个参数 addr 即监听地址;第二个参数表示服务端处理程序,通常为nil    //当参2为nil时,服务端调用 http.DefaultServeMux 进行处理    http.ListenAndServe("127.0.0.1:8000", nil)}

浏览器访问 http://localhost:8000/hello ,返回 "hello http" 。

服务端打印:method = GETURL = /helloheader = map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Connection:[keep-alive] Dnt:[1] Sec-Ch-Ua:["Chromium";v="110", "Not A(Brand";v="24", "GoogleChrome";v="110"] Sec-Ch-Ua-Mobile:[?0] Sec-Ch-Ua-Platform:["Windows"] Sec-Fetch-Dest:[document] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[none] Sec-Fetch-User:[?1] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36]]body = {}127.0.0.1:2651 连接成功

回调函数myHandler(w http.ResponseWriter, r *http.Request)有两个参数:

  • w http.ResponseWriter用来给客户端返回响应数据,它是一个 interface:
type ResponseWriter interface {   Header() Header               Write([]byte) (int, error)       WriteHeader(int)            }
  • r *http.Request用来接收客户端的请求数据,浏览器发送给服务器的 http 请求包的内容可以借助 r 来查看。它对应一个结构体:
type Request struct {    Method string        // 浏览器请求方法 GET、POST…    URL *url.URL        // 浏览器请求的访问路径    ……    Header Header        // 请求头部    Body io.ReadCloser    // 请求包体    RemoteAddr string    // 浏览器地址    ……    ctx context.Context}

HTTP客户端

客户端访问 Web 服务器数据,主要使用 func Get(url string) (resp *Response, err error)函数来完成,其读到的响应报文数据被保存在 Response 结构体中。

type Response struct {   Status     string // e.g. "200 OK"   StatusCode int    // e.g.  200   Proto      string // e.g. "HTTP/1.0"   ……   Header Header   Body io.ReadCloser   ……}
  • 服务器发送的响应包体被保存在 Body 中,可以使用它提供的 Read 方法来获取数据内容,可以将其保存至切片缓冲区中,拼接成一个完整的字符串来查看。

  • 结束的时候,需要调用 Body 中的 Close() 方法关闭 I/O 。

示例:

import (    "fmt"    "net/http")func main() {    // 使用Get方法获取服务器响应包数据    // resp, err := http.Get("http://www.baidu.com")    resp, err := http.Get("http://127.0.0.1:8000/hello")    if err != nil {        fmt.Println("Get err:", err)        return    }    defer resp.Body.Close()    // 获取服务器端读到的数据    fmt.Println("Status = ", resp.Status)         // 状态    fmt.Println("StatusCode = ", resp.StatusCode) // 状态码    fmt.Println("Header = ", resp.Header)         // 响应头部    fmt.Println("Body = ", resp.Body)             // 响应包体    buf := make([]byte, 4096) // 定义切片缓冲区,存读到的内容    var result string    // 获取服务器发送的数据包内容    for {        n, err := resp.Body.Read(buf) // 读body中的内容。        if n == 0 {            fmt.Println("Body.Read err:", err)            break        }        result += string(buf[:n]) // 累加读到的数据内容    }    // 打印从body中读到的所有内容    fmt.Println("result = ", result)}

关键词: