golang从服务器响应自动生成Go结构体插件库rts的使用
Golang从服务器响应自动生成Go结构体插件库rts的使用
RTS (Request to Struct) 是一个可以从JSON服务器响应自动生成Go结构体定义的库。
功能特性
- 根据路由文件中的指定行定义类型名称并跳过数字
- 支持参数化路由 (如
/users/:user/posts/:pid
) - 支持自定义请求头,可用于需要授权保护的API响应
安装
CLI工具安装
go get -u github.com/galeone/rts/cmd/rts
CLI使用说明
rts [options]
-headers string
为每个请求添加的请求头
-help
打印帮助信息
-insecure
禁用HTTPS的TLS证书检查(当HTTPS服务器证书由未知机构签名时使用)
-out string
输出文件。如果不指定则使用标准输出
-pkg string
包名 (默认 "main")
-routes string
要请求的路由,每行一个 (默认 "routes.txt")
-server string
设置服务器地址 (默认 "http://localhost:9090")
-substruct
为子结构创建类型
示例
简单示例
可以通过管道将单个JSON传递给rts并转换为Go结构体:
echo ' {
"Book Id": 30558257,
"Title": "Unsouled (Cradle, #1)",
"Author": "Will Wight",
"Author l-f": "Wight, Will",
"Additional Authors": "",
"BCID": ""
}' | ./rts
输出结果:
package main
type Foo1 struct {
Additional_Authors string `json:"Additional Authors"`
Author string `json:"Author"`
Author_l_f string `json:"Author l-f"`
Bcid string `json:"BCID"`
Book_Id int64 `json:"Book Id"`
Title string `json:"Title"`
}
复杂示例
可以定义更复杂的场景,在routes.txt
文件中为每个(参数化)请求定义一行:
routes.txt:
/
/repos/:user/:repo galeone igor
运行:
rts -server https://api.github.com -pkg example
输出结果:
package example
type Foo1 struct {
AuthorizationsURL string `json:"authorizations_url"`
CodeSearchURL string `json:"code_search_url"`
CommitSearchURL string `json:"commit_search_url"`
CurrentUserAuthorizationsHTMLURL string `json:"current_user_authorizations_html_url"`
CurrentUserRepositoriesURL string `json:"current_user_repositories_url"`
CurrentUserURL string `json:"current_user_url"`
EmailsURL string `json:"emails_url"`
EmojisURL string `json:"emojis_url"`
EventsURL string `json:"events_url"`
FeedsURL string `json:"feeds_url"`
FollowersURL string `json:"followers_url"`
FollowingURL string `json:"following_url"`
GistsURL string `json:"gists_url"`
HubURL string `json:"hub_url"`
IssueSearchURL string `json:"issue_search_url"`
IssuesURL string `json:"issues_url"`
KeysURL string `json:"keys_url"`
LabelSearchURL string `json:"label_search_url"`
NotificationsURL string `json:"notifications_url"`
OrganizationRepositoriesURL string `json:"organization_repositories_url"`
OrganizationTeamsURL string `json:"organization_teams_url"`
OrganizationURL string `json:"organization_url"`
PublicGistsURL string `json:"public_gists_url"`
RateLimitURL string `json:"rate_limit_url"`
RepositorySearchURL string `json:"repository_search_url"`
RepositoryURL string `json:"repository_url"`
StarredGistsURL string `json:"starred_gists_url"`
StarredURL string `json:"starred_url"`
TopicSearchURL string `json:"topic_search_url"`
UserOrganizationsURL string `json:"user_organizations_url"`
UserRepositoriesURL string `json:"user_repositories_url"`
UserSearchURL string `json:"user_search_url"`
UserURL string `json:"user_url"`
}
type ReposUserRepo struct {
AllowForking bool `json:"allow_forking"`
ArchiveURL string `json:"archive_url"`
Archived bool `json:"archived"`
AssigneesURL string `json:"assignees_url"`
BlobsURL string `json:"blobs_url"`
BranchesURL string `json:"branches_url"`
CloneURL string `json:"clone_url"`
CollaboratorsURL string `json:"collaborators_url"`
CommentsURL string `json:"comments_url"`
CommitsURL string `json:"commits_url"`
CompareURL string `json:"compare_url"`
ContentsURL string `json:"contents_url"`
ContributorsURL string `json:"contributors_url"`
CreatedAt string `json:"created_at"`
DefaultBranch string `json:"default_branch"`
DeploymentsURL string `json:"deployments_url"`
Description string `json:"description"`
Disabled bool `json:"disabled"`
DownloadsURL string `json:"downloads_url"`
EventsURL string `json:"events_url"`
Fork bool `json:"fork"`
Forks int64 `json:"forks"`
ForksCount int64 `json:"forks_count"`
ForksURL string `json:"forks_url"`
FullName string `json:"full_name"`
GitCommitsURL string `json:"git_commits_url"`
GitRefsURL string `json:"git_refs_url"`
GitTagsURL string `json:"git_tags_url"`
GitURL string `json:"git_url"`
HasDownloads bool `json:"has_downloads"`
HasIssues bool `json:"has_issues"`
HasPages bool `json:"has_pages"`
HasProjects bool `json:"has_projects"`
HasWiki bool `json:"has_wiki"`
Homepage string `json:"homepage"`
HooksURL string `json:"hooks_url"`
HTMLURL string `json:"html_url"`
ID int64 `json:"id"`
IsTemplate bool `json:"is_template"`
IssueCommentURL string `json:"issue_comment_url"`
IssueEventsURL string `json:"issue_events_url"`
IssuesURL string `json:"issues_url"`
KeysURL string `json:"keys_url"`
LabelsURL string `json:"labels_url"`
Language string `json:"language"`
LanguagesURL string `json:"languages_url"`
License ReposUserRepo_sub1 `json:"license"`
MergesURL string `json:"merges_url"`
MilestonesURL string `json:"milestones_url"`
MirrorURL interface{} `json:"mirror_url"`
Name string `json:"name"`
NetworkCount int64 `json:"network_count"`
NodeID string `json:"node_id"`
NotificationsURL string `json:"notifications_url"`
OpenIssues int64 `json:"open_issues"`
OpenIssuesCount int64 `json:"open_issues_count"`
Owner ReposUserRepo_sub2 `json:"owner"`
Private bool `json:"private"`
PullsURL string `json:"pulls_url"`
PushedAt string `json:"pushed_at"`
ReleasesURL string `json:"releases_url"`
Size int64 `json:"size"`
SSHURL string `json:"ssh_url"`
StargazersCount int64 `json:"stargazers_count"`
StargazersURL string `json:"stargazers_url"`
StatusesURL string `json:"statuses_url"`
SubscribersCount int64 `json:"subscribers_count"`
SubscribersURL string `json:"subscribers_url"`
SubscriptionURL string `json:"subscription_url"`
SvnURL string `json:"svn_url"`
TagsURL string `json:"tags_url"`
TeamsURL string `json:"teams_url"`
TempCloneToken interface{} `json:"temp_clone_token"`
Topics []string `json:"topics"`
TreesURL string `json:"trees_url"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
Visibility string `json:"visibility"`
Watchers int64 `json:"watchers"`
WatchersCount int64 `json:"watchers_count"`
WebCommitSignoffRequired bool `json:"web_commit_signoff_required"`
}
type ReposUserRepo_sub2 struct {
AvatarURL string `json:"avatar_url"`
EventsURL string `json:"events_url"`
FollowersURL string `json:"followers_url"`
FollowingURL string `json:"following_url"`
GistsURL string `json:"gists_url"`
GravatarID string `json:"gravatar_id"`
HTMLURL string `json:"html_url"`
ID int64 `json:"id"`
Login string `json:"login"`
NodeID string `json:"node_id"`
OrganizationsURL string `json:"organizations_url"`
ReceivedEventsURL string `json:"received_events_url"`
ReposURL string `json:"reos_url"`
SiteAdmin bool `json:"site_admin"`
StarredURL string `json:"starred_url"`
SubscriptionsURL string `json:"subscriptions_url"`
Type string `json:"type"`
URL string `json:"url"`
}
type ReposUserRepo_sub1 struct {
Key string `json:"key"`
Name string `json:"name"`
NodeID string `json:"node_id"`
SpdxID string `json:"spdx_id"`
URL string `json:"url"`
}
库使用
import "github.com/galeone/rts"
byteFile, err := rts.Do(pkg, server, lines, headerMap)
许可证
RTS: Request to Struct. 从服务器响应生成Go结构体。 版权所有 © 2016-2022 Paolo Galeone nessuno@nerdz.eu
此源代码表单受Mozilla公共许可证v2.0条款约束。如果未随此文件分发MPL副本,您可以从http://mozilla.org/MPL/2.0/获取。附件B未附加;本软件与MPL v2第1.12节中表达的许可证兼容。
更多关于golang从服务器响应自动生成Go结构体插件库rts的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang从服务器响应自动生成Go结构体插件库rts的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 从服务器响应自动生成Go结构体插件库 rts 的使用
rts (Response To Struct) 是一个能够从服务器响应自动生成Go结构体的工具库,特别适合处理JSON/XML API响应。
安装
go get github.com/flowchartsman/rts
基本使用
1. 从JSON响应生成结构体
package main
import (
"fmt"
"github.com/flowchartsman/rts"
)
func main() {
// 示例JSON响应
jsonResponse := `{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"active": true,
"address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
},
"tags": ["user", "premium"]
}`
// 生成结构体
structDef, err := rts.FromJSON("User", jsonResponse)
if err != nil {
panic(err)
}
fmt.Println(structDef)
}
输出结果将是自动生成的Go结构体定义。
2. 从HTTP响应生成结构体
package main
import (
"fmt"
"net/http"
"github.com/flowchartsman/rts"
)
func main() {
// 发送HTTP请求
resp, err := http.Get("https://api.example.com/users/1")
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 从HTTP响应生成结构体
structDef, err := rts.FromResponse("User", resp)
if err != nil {
panic(err)
}
fmt.Println(structDef)
}
高级功能
1. 自定义选项
// 使用自定义选项
options := &rts.Options{
OmitEmpty: true, // 生成omitempty标签
UseJSONTags: true, // 使用json标签
UseXMLTags: false, // 不使用xml标签
}
structDef, err := rts.FromJSONWithOptions("Product", jsonResponse, options)
2. 处理嵌套结构
rts会自动处理嵌套的JSON对象和数组,生成相应的嵌套结构体。
3. 类型推断
rts会尝试从响应值推断最合适的Go类型:
- 数字:根据大小选择int/int32/int64/float32/float64
- 字符串:string
- 布尔值:bool
- 数组/切片:[]T
- 对象:结构体
实际应用示例
假设我们有一个返回复杂JSON的API:
package main
import (
"fmt"
"github.com/flowchartsman/rts"
)
func main() {
complexJSON := `{
"status": "success",
"data": {
"users": [
{
"id": 1,
"name": "Alice",
"roles": ["admin", "user"]
},
{
"id": 2,
"name": "Bob",
"roles": ["user"]
}
],
"meta": {
"page": 1,
"total": 2,
"limit": 10
}
},
"timestamp": "2023-01-01T12:00:00Z"
}`
structDef, err := rts.FromJSON("APIResponse", complexJSON)
if err != nil {
panic(err)
}
fmt.Println("自动生成的结构体:")
fmt.Println(structDef)
}
生成的输出将包含完整的嵌套结构体定义,可以直接复制到你的代码中使用。
注意事项
- 对于动态字段名或不确定的结构,可能需要手动调整生成的代码
- 生成的标签可能不完全符合你的项目规范,需要检查
- 对于非常大的响应,可能需要调整内存设置
rts库极大简化了与JSON API交互时创建结构体的过程,减少了手动编写结构体定义的工作量和出错可能性。