当前位置: 首页 > article >正文

用go语言后端开发速查

在这里插入图片描述

文章目录

  • 一、发送请求和接收请求示例
    • 1.1 发送请求
    • 1.2 接收请求
  • 二、发送form-data格式的数据示例

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

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

1.1 发送请求

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 接收请求

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格式的数据示例

// 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 的方式相同。

http://www.kler.cn/a/397137.html

相关文章:

  • 速通前端篇 —— HTML
  • 自存 关于RestController请求传参数 前端和后端相关
  • git撤销、回退某个commit的修改
  • 自由学习记录(22)
  • 数据库的性能优化 -- SQL性能优化
  • git命令提交项目
  • Android从Drawable资源Id直接生成Bitmap,Kotlin
  • hive搭建
  • STM32传感器模块编程实践(十二) micro SD卡模块简介及驱动源码
  • [ACTF2020]Upload 1--详细解析
  • 健康之路三度冲击港交所,数字健康医疗平台IPO前景引关注
  • 【AI图像生成网站Golang】雪花算法
  • 前后端分离练习(云客项目)
  • 一文讲清楚人工智能自然语言处理中的数据预处理(数据清洗)
  • 【目标检测】用YOLOv8-Segment训练语义分割数据集(保姆级教学)
  • 34Web服务器(如Apache, Nginx)
  • SpringBoot如何集成WebSocket
  • 【LeetCode】每日一题 2024_11_15 最少翻转次数使二进制矩阵回文 I(模拟、矩阵遍历(竖着遍历))
  • SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型|文献速递-基于深度学习的病灶分割与数据超分辨率
  • 富格林:准确预判安全追损契机
  • flink架构 详解
  • GSMA eUICC 远程配置架构技术规范笔记 (SGP.02 v3.2)
  • 企业网络安全区域划分的原则和方法
  • 【鸿蒙开发】第十九章 Media媒体服务 --- 音频播放和录制
  • 鸿蒙进阶——HDI及IDL硬件接口IPC框架小结
  • 微服务各组件整合