Skip to content
On this page

HTTP

HTTP服务端

  • 一个最简单的服务
Go
package main

import (
	"fmt"
	"net/http"
)

func UserHandler(res http.ResponseWriter, req *http.Request) {
	fmt.Println("req method", req.Method)
	fmt.Println("req url", req.URL)
	// 返回响应
	res.Write([]byte ("请求到了"))
}

func main() {
	// 绑定回调
	http.HandleFunc("/user", UserHandler)
	// 监听并启动服务
	fmt.Println("Server is Running at http://127.0.0.1:9100")
	http.ListenAndServe(":9100", nil)
}
  • 根据不同请求方法执行不同操作
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)


func UserHandler(res http.ResponseWriter, req *http.Request) {
	fmt.Println("req method", req.Method)
	fmt.Println("req url", req.URL)
	// 返回响应
	res.Write([]byte ("请求到了"))
}

func HomeHandler(res http.ResponseWriter, req *http.Request) {
	switch req.Method {
		case http.MethodGet:
			html, err := os.ReadFile("home.html")
			if err != nil {
				fmt.Println("read home.html err", err)
				return
			}
			res.Write(html)
		case http.MethodPost:
			res.Header().Set("admin-token", "JFH)Y*#%HBJBFEGJ")
			res.Write([]byte("返回了数据。并在响应头添加了token"))
	}
}

func main() {
	// 绑定回调
	http.HandleFunc("/user", UserHandler)
	http.HandleFunc("/home", HomeHandler)
	// 监听并启动服务
	fmt.Println("Server is Running at http://127.0.0.1:9100")
	http.ListenAndServe(":9100", nil)
}
  • 返回JSON数据
Go
func GetJsonHandler(res http.ResponseWriter, req *http.Request) {
	jsonData := make(map[string]string)
	jsonData["name"] = "张环"
	jsonData["like"] = "跟随元芳"
	respData, err := json.Marshal(jsonData)
	if err != nil {
		fmt.Println("转换json数据失败", err)
		return
	}
	res.Header().Set("Content-Type", "application/json; charset=utf-8")
	res.Write(respData)
}

func main() {
	// 绑定回调
	http.HandleFunc("/get_json", GetJsonHandler)
	// 监听并启动服务
	fmt.Println("Server is Running at http://127.0.0.1:9100")
	http.ListenAndServe(":9100", nil)
}
  • 返回结构体声明的JSON,结构体中字段名首字母一定要大写,不然返回为空JSON
GO
func GetStructJson(res http.ResponseWriter, req *http.Request) {
	type UserInfo struct {
		UserName string // UserName 首字母一定要大写
		Age int   // Age 首字母一定要大写
		Like []string
	}
	userInfo := UserInfo{
		UserName: "张三",
		Age: 22,
		Like: []string {"篮球", "乒乓球", "羽毛球"},
	}
	respData, err := json.Marshal(userInfo)
	if err != nil {
		fmt.Println("转换json数据失败", err)
		return
	}	
	res.Header().Set("Content-Type", "application/json; charset=utf-8")
	res.Write(respData)
}

func main() {
	// 绑定回调
	http.HandleFunc("/user", UserHandler)
	http.HandleFunc("/home", HomeHandler)
	http.HandleFunc("/get_json", GetJsonHandler)
	http.HandleFunc("/get_struct_json", GetStructJson)
	// 监听并启动服务
	fmt.Println("Server is Running at http://127.0.0.1:9100")
	http.ListenAndServe(":9100", nil)
}

HTTP客户端

Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	res, err := http.Get("http://127.0.0.1:9100/get_struct_json")
	if err != nil {
		fmt.Println("http.Get err", err)
		return
	}
	data, err := io.ReadAll(res.Body)
	if err != nil {
		fmt.Println("read data err", err)
		return
	}
	// {"UserName":"张三","Age":22,"Like":["篮球","乒乓球","羽毛球"]}
	fmt.Println(string(data)) 
}

HTTP常用状态码

Go
http.StatusContinue     = 100
http.StatusOK           = 200
http.StatusMovedPermanently = 301
http.StatusFound        = 302
http.StatusBadRequest       = 400
http.StatusUnauthorized     = 401
http.StatusForbidden        = 403
http.StatusNotFound     = 404
http.StatusMethodNotAllowed = 405
http.StatusInternalServerError  = 500
http.StatusBadGateway  = 502
http.StatusGatewayTimeout = 504

实战

实现功能:请求接口,解析接口数据,然后筛选出符合条件的数据,将数据写入json文件中

Go
package main

import (
	"bufio"
	"encoding/json"
	"io"
	"log"
	"net/http"
	"os"
)

const requestUrl = "https://xxxxxxxxxx?mobileType=-1&mobileArea=-1&isLength=1&startTime=2024-06-10+00:00:00&endTime=2024-06-26+23:59:59&ecid=108683&msgtype=0&page=1&limit=100"

// 接口请求会来的数据结构
type ResponseData struct {
	Code int     `json:"code"`
	Msg  string  `json:"msg"`
	Data ResData `json:"data"`
}

type ResData struct {
	Records []Record `json:"records"`
}

type Record struct {
	UserID     string  `json:"userid"`
	Phone      string  `json:"phone"`
	MobileType int     `json:"mobileType"`
	MobileArea int     `json:"mobileArea"`
	IsLength   int     `json:"isLength"`
	ErrorCode  string  `json:"errorCode"`
	ErrorDesc  *string `json:"errorDesc"` // 使用指针以允许 null 值
	CustID     string  `json:"custid"`
	PtMsgID    string  `json:"ptmsgid"`
	SendTime   string  `json:"sendTime"`
	RecvTime   string  `json:"recvTime"`
	Message    string  `json:"message"`
	PkTotal    int     `json:"pktotal"`
	Strip      *string `json:"strip"` // 使用指针以允许 null 值
	WordNum    int     `json:"wordNum"`
	TotalWords int     `json:"totalwords"`
	MsgSrcIP   string  `json:"msgsrcip"`
}

func fetchSmsSendData() {
	req, err := http.NewRequest("GET", requestUrl, nil)
	// 设置需要的请求头
	req.Header.Add("Authorization", "Authorization")
	req.Header.Add("Cookie", "Cookie")
	if err != nil {
		log.Printf("构建请求失败:%s", err)
		return
	}
	res, err := http.DefaultClient.Do(req)
	log.Println("请求中.............")
	if err != nil {
		log.Printf("请求失败=> %s", err)
		return
	}
	log.Println("请求完成")
	body, err := io.ReadAll(res.Body)
	if err != nil {
		log.Printf("读取res.body失败=> %s", err)
		return
	}
	// 解析响应 并获得想要的数据
	var responseData ResponseData
	err = json.Unmarshal(body, &responseData)
	if err != nil {
		log.Printf("序列化res.body失败=> %s", err)
		return
	}
	records := responseData.Data.Records
	if len(records) == 0 {
		log.Printf("<<<<<<<<<<<<<没有符合的数据>>>>>>>>>>>>>")
		return
	}
	result := make([]Record, 0)
	for _, record := range records {
		if record.ErrorCode == "M2:0010" {
			result = append(result, record)
		}
	}
	log.Printf("<<<<<<<<<<<<<文件筛选完毕,准备写入文件>>>>>>>>>>>>>")
	// 将筛选出来的数组写入 json文件中
	writeDataToFile(result)
}

func writeDataToFile(data []Record) {
	// MarshalIndent 第二个参数表示 新的一行以什么开头 第三个参数表示开头后面跟着的缩进
	jsonByteData, err := json.MarshalIndent(data, "", "    ")
	if err != nil {
		log.Printf("data 转换byte失败%s\n", err)
		return
	}
	file, err := os.Create("records.json")
	if err != nil {
		log.Printf("创建records.json文件失败=> %s\n", err)
		return
	}
	defer file.Close()
	// 使用 bufio.Writer 提高写入效率
	writer := bufio.NewWriter(file)
	// 将 JSON 数据写入文件
	_, err = writer.Write(jsonByteData)
	if err != nil {
		log.Printf("文件写入失败%s\n", err)
		return
	}
	// 刷新 确保所有缓冲数据都写入文件
	writer.Flush()
	log.Printf("<<<<<<<<<<<<<文件写入完成>>>>>>>>>>>>>")
}

func main() {
	fetchSmsSendData()
}