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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务day09

DSL查询 快速入门 GET /items/_search {"query": {"match_all": {}} } 叶子查询 GET /items/_search {"query": {"match_all": {}} }GET /items/_search {"query": {"multi_match": {"query": "脱…

鸿蒙NEXT应用示例:切换图片动画

【引言】 在鸿蒙NEXT应用开发中,实现图片切换动画是一项常见的需求。本文将介绍如何使用鸿蒙应用框架中的组件和动画功能,实现不同类型的图片切换动画效果。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT B…

(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数

目录 前言 一、Map Maps 和 Objects 的区别 Map的迭代 forEach() Map对象的操作 二、Set Set 中的特殊值 三、Reflect 四、Proxy 五、字符串 六、数值 七、对象 八、数组 九、函数 参考文献 前言 一、Map Map 对象保存键值对。任何值(对象或者原始值) 都可以…

【动手学电机驱动】 STM32-FOC(7)MCSDK Pilot 上位机控制与调试

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

Flume1.9.0自定义Sink组件将数据发送至Mysql

需求 1、将Flume采集到的日志数据也同步保存到MySQL中一份,但是Flume目前不支持直接向MySQL中写数据,所以需要用到自定义Sink,自定义一个MysqlSink。 2、日志数据默认在Linux本地的/data/log/user.log日志文件中,使用Flume采集到…

Transformer学习笔记(一)

Transformer学习笔记 基于 3B1B 可视化视频 自注意力机制 1.每个词的初始嵌入是一个高维向量,只编码该单词含义,与上下文没有关联 2.对初始向量进行位置编码,在高维向量中编码进位置信息(单词在语言序列中的位置信息&#xff…

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为:geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下: {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

【数据库系列】 Spring Boot 集成 Neo4j 的详细介绍

Spring Boot 提供了对 Neo4j 的良好支持,使得开发者可以更方便地使用图数据库。通过使用 Spring Data Neo4j,开发者可以轻松地进行数据访问、操作以及管理。本文将详细介绍如何在 Spring Boot 应用中集成 Neo4j,包括基本配置、实体定义、数据…

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 📚mysql的安装📕MySQL的登录🌏MySQL配置免密码登录 📚mysql的…

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…

Docker:查看镜像里的文件

目录 背景步骤1、下载所需要的docker镜像2、创建并运行临时容器3、停止并删除临时容器 背景 在开发过程中,为了更好的理解和开发程序,有时需要确认镜像里的文件是否符合预期,这时就需要查看镜像内容 步骤 1、下载所需要的docker镜像 可以使…

C语言和C++的常量概念与区别分析

文章目录 💯前言💯常量的概念和作用💯C语言中 const 的应用与限制#define 和 enum 的使用方法 💯C 中 const 的计算方法和处理💯代码实例和应用区别💯C 和 C 的常量兼容性问题和负载💯分析 C 和…

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【大数据学习 | flume】flume Sink Processors与拦截器Interceptor

1. Failover Sink Processor 故障转移处理器可以同时指定多个sink输出,按照优先级高低进行数据的分发,并具有故障转移能力。 需要修改第一台服务器agent a1.sourcesr1 a1.sinksk1 k2 a1.channelsc1 a1.sources.r1.typenetcat a1.sources.r1.bindworker…

i春秋-登陆(sql盲注爆字段,.git缓存利用)

练习平台地址 竞赛中心 题目描述 先登陆再说 题目内容 就是一个登录框 测试登录 用户名:admin or 11# 密码:随便输 返回密码错误 用户名:随便输 密码:随便输 返回用户名不存在 这里就可以确定时一个bool盲注了 这里提供一个lik…

【爬虫实战】抓取某站评论

【爬虫实战】抓取某站评论 声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 方式一:JS逆向request发…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…

港湾周评|鼎益丰“庞氏骗局”陨落

《港湾商业观察》李镭 在坊间有着“老鼎”之称的鼎益丰迎来了全面陨落,这丝毫不出人意料,毕竟在一年前就已经暴雷了。 同样,仙风道骨般神采的鼎益丰老板隋广义也迎来人生的至暗时刻,应了无间道那句话,出来混总是要还…