Golang的API项目快速开始

开启一个简单的API服务。

golang的教程网上一大堆,官网也有非常详细的教程,这里不在赘述这些基础语法教程,我们意在快速进入项目开发阶段。

golang好用语法教程传送门: m.runoob.com/go/

编写第一个API

前提:按照上一篇文档初始化项目

1. 下载gin框架,一个非常好用的写API的框架,使用也很广泛

# 在项目文件下执行go命令下载gin依赖
go mod get github.com/gin-gonic/gin

2. 创建API文件夹:apis

3. 在apis创建第一个API文档:hello.go

4. 实现一个入参为name,返回为:hello name的api

package apis

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

// API入参参数
type HttpRequest struct {
	Name string `json:"name"`
}

// API响应参数
type HttpRespone struct {
	Status  int    `json:"status"`
	Message string `json:"message"`
	Data    string `json:"data"`
}

/*
实现一个入参为name,响应为:hello name的api
这个例子中,异常信息通过status和message返回,api响应状态正常,如果需要响应400等异常状态,可以更换c.JSON(http.StatusOK, res)中的StatusOK
*/
func Hello(c *gin.Context) {
	// 声明req
	var req HttpRequest
	// 声明res并初始化
	var res = HttpRespone{}

	// 获取api请求参数
	err := c.ShouldBindBodyWith(&req, binding.JSON)
	// 出现错误,则响应错误信息
	if err != nil {
		res.Status = 10
		res.Message = "读取请求参数错误"
		c.JSON(http.StatusOK, res)
		return
	}
	// 判断是否入参name
	if req.Name == "" {
		res.Status = 20
		res.Message = "参数name为空"
		c.JSON(http.StatusOK, res)
		return
	}
	// 正常响应 hello name
	res.Status = 0
	res.Message = "成功"
	res.Data = fmt.Sprintf("hello %v", req.Name)
	c.JSON(http.StatusOK, res)
}

5. 在apis文件夹中创建apis.go,编写api路由注册和服务启动方法

package apis

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func StartHttp() {
	// 设置为发布模式(初始化路由之前设置)
	gin.SetMode(gin.ReleaseMode)
	// gin 默认中间件
	r := gin.Default()

	// 访问一个错误路由时,返回404
	r.NoRoute(func(c *gin.Context) {
		c.JSON(http.StatusNotFound, gin.H{
			"status":  404,
			"message": "404, page not exists!",
		})
	})

	// 注册hello路由
	r.POST("/hello", Hello)

	// 启动API服务
	if err := r.Run(":8080"); err != nil {
		panic(err)
	}
}

6. 入口文件main.go引用apis模块

package main

import "prj_aiee/apis"

func main() {
	apis.StartHttp()
}

完整的项目文件构成如图:

7.  启动服务

# 项目文件夹下执行go命令
go run main.go

8. 调用api

# 执行curl命令调用API
curl -X POST "http://localhost:8080/hello" -H "content-type: application/json" -d "{\"name\": \"aiee\"}"

9. 响应如下: {"status":0,"message":"成功","data":"hello aiee"}

项目源码:GitHub - liyonge-cm/go_prj_aiee: go api 服务 demo

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

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

相关文章

Python列表(list)

目录 列表列表的创建与删除访问列表元素index() 方法 列表的遍历添加,修改和删除列表元素添加修改删除 对列表统计和计算count() 方法如需确定列表中有**多少元素**,请使用 len() 方法:检查项目是否存在**复制列表****合并两个列表****list()…

李沐之经典卷积神经网络

目录 1. LeNet 2. 代码实现 1. LeNet 输入是32*32图片,放到一个5*5的卷积层里面,卷积层的输出通道数是6,高宽都是28(32-5128)。再经过2*2的池化层,把28*28变成14*14(28-22)/214&am…

数据在内存中的存储(C语言)

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty‘s blog 引言 ​ 我们早就学完基本的数据类型,那这些数据类型…

window中安装Apache http server(httpd-2.4.58-win64-VS17)

windows中安装Apache http server(httpd-2.4.58-win64-VS17) 1、下载windows版本的的httpd, https://httpd.apache.org/docs/current/platform/windows.html#down 这里选择的是Apache Lounge编译的版本 https://www.apachelounge.com/download/ 2、解压到指定目录,这…

【5】商密测评密码辅助工具

0X01 前言 最近在学了下商密测评,研究了下技术层面的测评,感觉找工具不方便,就顺手自己造了个辅助工具,都是自己遇到需要用的。 0x02 工具功能介绍 不爱打字,直接上图。后续根据技术测评层面需要继续完善和增加功能。…

Hive基础知识(九):Hive对数据库表的增删改查操作

1. 创建表 1)建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name #EXTERNAL:外部的 [(col_name data_type [COMMENT col_comment],...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment],...)]#PARTITIO…

Session与Cookie

目录 一、Session会话技术 概念 常用方法 生命周期 有效期 场景 二、Cookie技术 一、Session会话技术 概念 浏览器和服务器之间为了实现某个功能,产生了多次请求和响应,从第一次请求开始到最后一次请求结束,这期间所有的请求和响应加…

走进Docker的世界

文章目录 前言一、Docker相关概述1、什么是docker?2、为什么出现docker?2.1 容器与kvm虚拟化的对比2.2 docker的作用 二、安装docker及配置文件调整1.配置宿主机网卡转发2.yum安装docker3.修改daemon.json文件4.修改docker镜像和容器的默认存储路径5.启动…

高效构建Java应用:Maven入门和进阶(四)

高效构建Java应用:Maven入门和进阶(四) 四. Maven聚合和继承特性4.1 Maven工程继承关系4.2 Maven工程聚合关系 四. Maven聚合和继承特性 4.1 Maven工程继承关系 继承概念 Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目…

GLES学习笔记---立方体贴图(一张图)

一、首先看一张效果图 立方体贴图 二、纹理坐标划分 如上图是一张2D纹理,我们需要将这个2D纹理贴到立方体上,立方体有6个面,所以上面的2D图分成了6个面,共有14个纹理坐标 三、立方体 上边的立方体一共8个顶点坐标,范围…

Redis(四)事务

文章目录 事务Redis事务 vs 数据库事务常用命令总结 事务 一个队列中、一次性、顺序性、排他性执行一系列命令 官网https://redis.io/docs/interact/transactions/ Redis事务 vs 数据库事务 概述详述1、单独的隔离操作Redis的事务仅仅是保证事务里的操作会被连续独占的执行&a…

2022 年全国职业院校技能大赛高职组云计算赛项试卷

【赛程名称】云计算赛项第一场-私有云 某企业拟使用OpenStack 搭建一个企业云平台,以实现资源池化弹性管理、企业应用集中管理、统一安全认证和授权等管理。 系统架构如图 1 所示,IP 地址规划如表 1 所示。 图 1 系统架构图 表 1 IP 地址规划 设备…

Java零基础教学文档第四篇:HTML_CSS_JavaScript(2)

【HTML】 【主要内容】WEB: 1.Web前端简介 2.创建第一个前端项目 3.相关标签详解 4.表格标签详解 5.表单标签详解 6.框架和实体字符 【学习目标】 1. Web前端简介 1.1 为什么要学习Web前端&#…

【Python机器学习】SVM——预处理数据

为了解决特征特征数量级差异过大,导致的模型过拟合问题,有一种方法就是对每个特征进行缩放,使其大致处于同一范围。核SVM常用的缩放方法是将所有的特征缩放到0和1之间。 “人工”处理方法: import matplotlib.pyplot as plt from…

Java异常处理之旅:解救迷失的程序员

目录​​​​​​​ 一、前言 二、基础知识 2.1 异常的概念 ​​​​​​2.2 异常分类 2.3 异常处理的原则 ​​​​​​三、异常处理的语法 3.1 try-catch语句 3.2 finally语句 3.3 throw语句 3.4 throws关键字 3.5 自定义异常 四、常见异常及处理方式 4.1 NullP…

【C语言】linux内核set_task_stack_end_magic函数

一、函数定义 void set_task_stack_end_magic(struct task_struct *tsk) {unsigned long *stackend;stackend end_of_stack(tsk);*stackend STACK_END_MAGIC; /* for overflow detection */ } 内核版本6.4.3、6.7。 二、代码解读 解读1 这段代码是一个在Linux内核中定…

芯课堂 | 固件升级方法及架构

本次介绍一种固件升级方法及架构。 所述方法通过运行引导加载程序,并基于引导加载程序,获取启动引导标志位; 在启动引导标志位为预设枚举标志位时,执行对应启动引导标志位的固件升级动作; 在启动引导标志位为非预设…

Cesium 模型压平

最近整理了下手上的代码,以下是对模型压平的说明。 原理是使用了customShader来重新设置了模型的着色器,通过修改模型顶点的坐标来实现了压平。 废话不多说,下面上代码: /*** class* description 3dtiles模型压平*/ class Flat…

leetcode 每日一题 2024年01月11日 构造有效字符串的最少插入数

题目 2645. 构造有效字符串的最少插入数 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 示例 …

辞旧岁,赢新篇,创维汽车召开年度会议立足过去,展望未来

为辞旧迎新,再创辉煌,创维汽车于1月4日-5日召开了事业部年度会议。本次会议将23年整体运营情况作出总结并对新一年的发展作出了目标规划。创维集团、创维汽车创始人黄宏生先生,开沃新能源汽车集团执行董事兼首席运营官诸萍女士,创…