用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 的方式相同。
相关推荐
小吉在努力敲代码中12 分钟前
c++实现B树(下)
开发语言·数据结构·c++·b树·算法
一只小松许️21 分钟前
现代C++HTTP框架cinatra
开发语言·c++·http
不爱学英文的码字机器28 分钟前
[C++] 智能指针
开发语言·c++·算法
♡喜欢做梦28 分钟前
【数据结构】栈和队列详解!!!--Java
java·开发语言·数据结构·链表
三里清风_31 分钟前
如何使用Casbin设计后台权限管理系统
golang·go·casbin
静止了所有花开32 分钟前
SpringSSM整合
java·开发语言·mybatis
Dreams°12333 分钟前
【JavaScript 网页设计实例教程:电商+视频】详细教程
开发语言·前端·javascript
小狮子安度因1 小时前
Qt文件目录操作
开发语言·qt
好开心331 小时前
javaScript交互补充3(JSON数据)
开发语言·前端·javascript·ecmascript·交互
0x派大星1 小时前
【Goland】——Gin 框架中间件详解:从基础到实战
开发语言·后端·中间件·golang·go·gin