用go语言后端开发速查

文章目录

用go语言发送请求和接收请求的快速参考

一、发送请求和接收请求示例

1.1 发送请求

go 复制代码
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type Payload struct {
	Name  string `json:"topic"`
	Value string `json:"data"`
}

func main() {
	// 构造要发送的数据
	payload := Payload{
		Name:  "example",
		Value: "this is a test",
	}

	// 将数据编码为JSON
	jsonData, err := json.Marshal(payload)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}

	// 发送POST请求
	resp, err := http.Post("http://localhost:8080/devStatistic/pushDevStatistic",
		"application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Error sending POST request:", err)
		return
	}
	defer resp.Body.Close()

	// 打印响应状态
	fmt.Println("Response status:", resp.Status)
}

1.2 接收请求

go 复制代码
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

type Payload struct {
	Name  string `json:"name"`
	Value string `json:"value"`
}

func handler(w http.ResponseWriter, r *http.Request) {
	if r.Method == "POST" {
		// 读取请求体中的数据
		body, err := ioutil.ReadAll(r.Body)
		if err != nil {
			http.Error(w, "Error reading request body", http.StatusInternalServerError)
			return
		}

		// 打印原始请求体内容
		fmt.Println("Received request body:", string(body))

		// 将请求体数据解析为结构体
		var payload Payload
		err = json.Unmarshal(body, &payload)
		if err != nil {
			http.Error(w, "Error parsing JSON", http.StatusBadRequest)
			return
		}

		// 打印解析后的数据
		fmt.Printf("Parsed data: Name = %s, Value = %s\n", payload.Name, payload.Value)

		// 返回响应
		fmt.Fprintf(w, "Received data: Name = %s, Value = %s\n", payload.Name, payload.Value)
	} else {
		// 处理其他请求
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}

func main() {
	http.HandleFunc("/", handler)

	fmt.Println("Server is running on http://localhost:8080")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		fmt.Println("Error starting server:", err)
	}
}

二、发送form-data格式的数据示例

go 复制代码
// sender.go
package main

import (
        "bytes"
        "fmt"
        "mime/multipart"
        "net/http"
)

// SendHTTPSMessage 使用 multipart/form-data 发送消息
func SendHTTPSMessage(topic, text, ip string, port int) error {
        // 创建一个缓冲区用来存放 form-data 数据
        var formDataBuffer bytes.Buffer
        writer := multipart.NewWriter(&formDataBuffer)

        // 添加 form-data 字段
        err := writer.WriteField("topic", topic)
        if err != nil {
                return fmt.Errorf("error adding topic field: %v", err)
        }
        err = writer.WriteField("content", text)
        if err != nil {
                return fmt.Errorf("error adding content field: %v", err)
        }

        // 关闭 writer,以便生成完整的 form-data
        err = writer.Close()
        if err != nil {
                return fmt.Errorf("error closing writer: %v", err)
        }

        // 构建目标 URL
        url := fmt.Sprintf("https://%s:%d/api/send_message", ip, port)

        // 创建 HTTP POST 请求
        req, err := http.NewRequest("POST", url, &formDataBuffer)
        if err != nil {
                return fmt.Errorf("error creating HTTP request: %v", err)
        }

        // 设置请求头的 Content-Type 为 multipart/form-data,并包含 boundary 信息
        req.Header.Set("Content-Type", writer.FormDataContentType())

        // 创建 HTTP 客户端并发送请求
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
                return fmt.Errorf("error sending HTTPS request: %v", err)
        }
        defer resp.Body.Close()

        // 打印响应状态
        fmt.Println("Response Status:", resp.Status)
        return nil
}

解释

  1. 使用 multipart.NewWriter** 创建 form-data**:
    • multipart.NewWriter 创建了一个 writer,可以将字段添加到 form-data。
    • 使用 WriteField 方法添加 topic 和 content 字段到 form-data。
  2. 设置 Content-Type
    • req.Header.Set("Content-Type", writer.FormDataContentType()) 会自动生成包含 boundary 的 Content-Type,这是 multipart/form-data 必需的格式。
  3. 发送请求:
    • 创建 HTTP 客户端并发送请求,与 JSON 的方式相同。
相关推荐
郝学胜-神的一滴3 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
测试员周周3 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
摇滚侠3 小时前
@Autowired 和 @Resource 的区别
java·开发语言
Wy_编程3 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel3 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
大卡片4 小时前
C++的基础知识点
开发语言·c++
郑同学的笔记5 小时前
【Qt教程29】Qt5和Qt6版本对比
开发语言·qt
基德爆肝c语言5 小时前
Qt 主窗口全家桶:菜单栏、工具栏、状态栏与对话框完全指南
开发语言·qt
lolo大魔王6 小时前
Go 后端实战|Gin + GORM V2 + MySQL 企业级 API 项目开发(完整版)
mysql·golang·gin
XMYX-06 小时前
28 - Go JSON 数据操作
开发语言·golang·json