0

0

Go新手如何写一个API接口_Go接口开发入门项目

P粉602998670

P粉602998670

发布时间:2026-01-17 14:40:51

|

825人浏览过

|

来源于php中文网

原创

用 net/http 可快速启动最简 API 服务:定义 HandlerFunc 处理路由,设置 JSON Content-Type,显式写入状态码,正确解析 query 和 body,返回结构化错误,并注意 CORS 配置时机。

go新手如何写一个api接口_go接口开发入门项目

net/http 启动最简 API 服务,别急着上框架

Go 新手写第一个 API,不需要 ginecho 或任何第三方库。标准库 net/http 足够跑通全流程,且能避开框架封装带来的黑盒感。

常见错误是直接抄一段带路由库的代码,结果连 http.ListenAndServe 崩溃都没法定位——因为没处理端口被占、TLS 配置错、或 HandlerFunc 返回值类型不对。

  • http.HandleFunc 的第二个参数必须是 func(http.ResponseWriter, *http.Request) 类型,少一个星号(*)就编译失败
  • 启动前检查端口:运行前执行 lsof -i :8080(macOS/Linux)或 netstat -ano | findstr :8080(Windows)
  • 返回 JSON 时务必设置 w.Header().Set("Content-Type", "application/json; charset=utf-8"),否则前端可能解析成字符串
package main

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

func helloHandler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	json.NewEncoder(w).Encode(map[string]string{
		"message": "Hello from Go",
		"status":  "ok",
	})
}

func main() {
	http.HandleFunc("/api/hello", helloHandler)
	fmt.Println("Server starting on :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

接收 query 参数和 JSON body,注意 r.ParseForm()io.ReadAll 的区别

新手常混淆 URL 查询参数(?name=alice)和请求体(POST /api/user { "name": "alice" })。前者用 r.URL.Query().Get("name"),后者必须读取原始字节再解码。

关键陷阱:r.Bodyio.ReadCloser,只能读一次;若先调用 r.ParseForm()(用于表单),再读 r.Body 就会得到空内容。

  • GET 请求取 query:用 r.URL.Query().Get("id"),不用 ParseForm
  • POST/PUT 的 JSON body:用 io.ReadAll(r.Body) + json.Unmarshal,读完记得 defer r.Body.Close()
  • 如果同时需要表单字段和 JSON,优先统一走 JSON,避免混合解析逻辑

返回结构化错误,别用 http.Error 硬塞字符串

直接调 http.Error(w, "not found", http.StatusNotFound) 对调试不友好——前端拿不到错误码字段,日志也难聚合。应该统一返回 JSON 错误对象,并保持 HTTP 状态码正确。

白瓜AI
白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

典型翻车点:状态码设成 200 但内容是 {"error": "xxx"},导致前端以为成功;或者错误里混入敏感路径、堆栈,暴露服务细节。

  • 定义错误响应结构体,含 code(业务码)、message(用户提示)、detail(仅开发看)
  • w.WriteHeader(statusCode) 显式设状态码,再写 JSON,不要依赖 json.Encoder 自动设 200
  • 生产环境关闭详细错误(如 runtime/debug.Stack()),用日志 ID 替代堆栈

本地调试加 CORS,但上线前删掉或配白名单

前端在 localhost:3000 调用本地 Go API 时,浏览器会拦截跨域请求。开发阶段可以临时加 CORS 头,但这是权宜之计,不是解决方案。

容易忽略的是:加了 Access-Control-Allow-Origin: "*" 后,不能再带 Credentials(比如 Cookie),否则浏览器直接拒绝;而 OPTIONS 预检请求若没处理,连实际请求都发不出。

  • 开发期快速通过:在 handler 开头加 w.Header().Set("Access-Control-Allow-Origin", "*")
  • 需要带认证时,必须指定具体域名(如 "http://localhost:3000"),并加 Access-Control-Allow-Credentials: "true"
  • 上线前删掉这些头,改由反向代理(Nginx / Cloudflare)统一处理 CORS

真正卡住新手的,往往不是语法,而是 HTTP 协议细节没露过面:状态码语义、header 优先级、body 读取生命周期、预检请求触发条件。把这几个点摸清,比记住十个框架 API 更管用。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

498

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3508

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号