0

0

使用 GoRest 构建 API 时如何提供 JSON 对象 ID

霞舞

霞舞

发布时间:2025-09-25 17:42:01

|

536人浏览过

|

来源于php中文网

原创

使用 gorest 构建 api 时如何提供 json 对象 id

本文介绍了在使用 GoRest 框架构建 API 时,如何修改输出数据的 JSON 结构,使其包含一个顶层的对象 ID,以满足前端模板引擎(如 Mustache.js)的需求。通过修改数据结构和 EndPoint 的 output 定义,可以轻松实现所需的 JSON 格式。

在使用 GoRest 构建 API 时,有时我们需要调整 API 返回的 JSON 数据的结构,以便更好地与前端模板引擎或其他客户端进行交互。例如,某些模板引擎可能期望 JSON 数据包含一个顶层对象 ID,而不是直接返回一个数组。

以下是如何修改 GoRest API 的输出,以提供包含对象 ID 的 JSON 数据的方法:

1. 修改数据结构

首先,我们需要创建一个新的数据结构,该结构将包含一个字段用于存储原始数据数组。例如,如果原始数据是一个 Item 类型的数组,我们可以创建一个名为 ItemStore 的结构体,其中包含一个 Items 字段,该字段是一个 Item 类型的切片。

type ItemStore struct {
    Items []Item `json:"repo"` // 修改json tag
}

type Item struct {
    Id       int    `json:"Id"`
    FileName string `json:"FileName"`
    Active   bool   `json:"Active"`
}

var itemStore ItemStore

在这个例子中,我们添加了 json:"repo" tag,这样JSON序列化后的key会变成repo。

2. 修改 EndPoint 的 output 定义

接下来,我们需要修改 GoRest EndPoint 的 output 定义,将其指向新的数据结构 ItemStore,而不是原始的 []Item。

Android 开发者指南 第一部分:入门
Android 开发者指南 第一部分:入门

Android文档-开发者指南-第一部分:入门-中英文对照版 Android提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。第一部分:Introduction(入门) 0、Introduction to Android(引进到Android) 1、Application Fundamentals(应用程序基础) 2、Device Compatibility(设备兼容性) 3、

下载
type HelloService struct {
    gorest.RestService `root:"/api" consumes:"application/json" produces:"application/json"`
    playList    gorest.EndPoint `method:"GET" path:"/list/" output:"ItemStore"`
    playItem    gorest.EndPoint `method:"PUT" path:"/go/{Id:int}" postdata:"Item"`
}

func (serv HelloService) PlayList() ItemStore {
    serv.ResponseBuilder().SetResponseCode(200)
    // 假设 itemStore.Items 已经填充了数据
    return itemStore
}

3. 返回新的数据结构

最后,在处理请求的函数中,我们需要返回新的 ItemStore 结构体,而不是原始的 []Item 切片。

完整示例

package main

import (
    "github.com/gorilla/mux"
    "github.com/gorilla/handlers"
    "github.com/emicklei/go-restful/v3"
    "log"
    "net/http"
    "os"
)

type HelloService struct {
    restful.WebService
}

func NewHelloService() *HelloService {
    s := new(HelloService)
    s.
        WebService = restful.WebService{}
    s.
        Path("/api").
        Consumes(restful.MIME_JSON).
        Produces(restful.MIME_JSON)

    s.Route(s.GET("/list").To(s.PlayList).Produces(restful.MIME_JSON).Writes(ItemStore{}))
    s.Route(s.PUT("/go/{Id}").To(s.PlayItem).Consumes(restful.MIME_JSON).Reads(Item{}))
    return s
}

func (serv *HelloService) PlayList(request *restful.Request, response *restful.Response) {
    response.WriteHeader(http.StatusOK)
    response.WriteEntity(itemStore)

}

func (serv *HelloService) PlayItem(request *restful.Request, response *restful.Response) {
    id := request.PathParameter("Id")
    var item Item
    err := request.ReadEntity(&item)
    if err != nil {
        response.WriteHeader(http.StatusBadRequest)
        return
    }
    log.Printf("Received item: %+v with ID: %s\n", item, id)
    response.WriteHeader(http.StatusOK)
}

type ItemStore struct {
    Items []Item `json:"repo"`
}

type Item struct {
    Id       int    `json:"Id"`
    FileName string `json:"FileName"`
    Active   bool   `json:"Active"`
}

var itemStore ItemStore

func main() {
    itemStore = ItemStore{
        Items: []Item{
            {Id: 1, FileName: "test :1", Active: false},
            {Id: 2, FileName: "test :2", Active: false},
        },
    }

    wsContainer := restful.NewContainer()
    NewHelloService().AddToWebService(wsContainer)

    // Optionally, you can enable logging.
    accessLog := log.New(os.Stdout, "api-access ", log.LstdFlags)
    cors := handlers.CORS(
        handlers.AllowedHeaders([]string{"Content-Type", "Accept"}),
        handlers.AllowedOrigins([]string{"*"}),
        handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}),
    )
    router := mux.NewRouter()
    router.PathPrefix("/").Handler(wsContainer)

    loggedRouter := handlers.CombinedLoggingHandler(os.Stdout, router)
    preflightRouter := cors(loggedRouter)

    log.Printf("start listening on localhost:8080")
    server := &http.Server{Addr: ":8080", Handler: preflightRouter}
    log.Fatal(server.ListenAndServe())
}

注意事项

  • 确保 ItemStore 结构体中的 Items 字段使用了正确的 JSON tag,例如 json:"repo",以便生成的 JSON 数据包含正确的对象 ID。
  • 根据实际需求调整数据结构和字段名称。
  • 仔细检查 API 的 output 定义,确保其与返回的数据结构一致。

总结

通过修改数据结构和 GoRest EndPoint 的 output 定义,我们可以轻松地控制 API 返回的 JSON 数据的结构,使其满足前端或其他客户端的需求。这种方法可以帮助我们更好地与各种不同的系统进行集成,并提高 API 的灵活性和可用性。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

415

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

75

2025.09.10

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

189

2025.07.04

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

0

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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