开发RESTAPI初始客户端

立即解锁
发布时间: 2025-09-14 00:08:02 阅读量: 3 订阅数: 38 AIGC
### 开发 REST API 初始客户端 在拥有待办事项 REST API 服务器后,我们可以构建一个命令行应用程序,利用该 API 来查询、添加、完成和删除待办事项。 #### 1. 创建项目目录结构 首先,在根目录下创建 REST API 客户端的目录结构: ```bash $ mkdir -p $HOME/pragprog.com/rggo/apis/todoClient $ cd $HOME/pragprog.com/rggo/apis/todoClient ``` #### 2. 初始化 Cobra 应用 使用 Cobra 框架生成器生成应用程序的一些样板代码: ```bash $ cobra init --pkg-name pragprog.com/rggo/apis/todoClient ``` 此命令假设你在主目录中有一个 Cobra 配置文件。若之前执行过相关示例,应该已有该文件;否则,需创建配置文件。也可以不使用配置文件初始化应用,Cobra 会使用默认选项,代码中的许可证和注释会与示例不同。 #### 3. 初始化 Go 模块 为项目初始化 Go 模块,并确保使用 Cobra v1.1.3: ```bash $ cd $HOME/pragprog.com/rggo/apis/todoClient $ go mod init pragprog.com/rggo/apis/todoClient $ go mod edit --require github.com/spf13/[email protected] $ go mod tidy ``` #### 4. 定义子命令 该命令行应用程序有五个子命令: | 命令 | 描述 | | --- | --- | | add <task> | 后跟任务字符串,将新任务添加到列表中 | | list | 列出列表中的所有项目 | | complete <n> | 完成第 n 项 | | del <n> | 从列表中删除第 n 项 | | view <n> | 查看第 n 项的详细信息 | #### 5. 开发应用骨架并实现 list 命令 ##### 5.1 修改根命令 编辑 `cmd/root.go` 文件,更新导入部分,添加 `strings` 包。更新 `rootCmd` 命令定义,修改简短描述并删除长描述。修改 `init` 函数,添加 `api-root` 命令行标志,并使用 Viper 绑定到环境变量 `TODO_API_ROOT`。 ```go // apis/todoClient/cmd/root.go import ( "fmt" "os" "strings" "github.com/spf13/cobra" homedir "github.com/mitchellh/go-homedir" "github.com/spf13/viper" ) var rootCmd = &cobra.Command{ Use: "todoClient", Short: "A Todo API client", // Uncomment the following line if your bare application // has an action associated with it: // Run: func(cmd *cobra.Command, args []string) { }, } func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.todoClient.yaml)") rootCmd.PersistentFlags().String("api-root", "http://localhost:8080", "Todo API URL") replacer := strings.NewReplacer("-", "_") viper.SetEnvKeyReplacer(replacer) viper.SetEnvPrefix("TODO") viper.BindPFlag("api-root", rootCmd.PersistentFlags().Lookup("api-root")) } ``` ##### 5.2 定义连接到 REST API 的逻辑 创建并编辑 `cmd/client.go` 文件,添加包定义和导入列表。定义错误值、自定义类型、新客户端函数、获取待办事项的函数以及获取所有待办事项的函数。 ```go // apis/todoClient/cmd/client.go package cmd import ( "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "time" ) var ( ErrConnection = errors.New("Connection error") ErrNotFound = errors.New("Not found") ErrInvalidResponse = errors.New("Invalid server response") ErrInvalid = errors.New("Invalid data") ErrNotNumber = errors.New("Not a number") ) type item struct { Task string Done bool CreatedAt time.Time CompletedAt time.Time } type response struct { Results []item `json:"results"` Date int `json:"date"` TotalResults int `json:"total_results"` } func newClient() *http.Client { c := &http.Client{ Timeout: 10 * time.Second, } return c } func getItems(url string) ([]item, error) { r, err := newClient().Get(url) if err != nil { return nil, fmt.Errorf("%w: %s", ErrConnection, err) } defer r.Body.Close() if r.StatusCode != http.StatusOK { msg, err := ioutil.ReadAll(r.Body) if err != nil { return nil, fmt.Errorf("Cannot read body: %w", err) } err = ErrInvalidResponse if r.StatusCode == http.StatusNotFound { err = ErrNotFound } return nil, fmt.Errorf("%w: %s", err, msg) } var resp response if err := json.NewDecoder(r.Body).Decode(&resp); err != nil { return nil, err } if resp.TotalResults == 0 { return nil, fmt.Errorf("%w: No results found", ErrNotFound) } return resp.Results, nil } func getAll(apiRoot string) ([]item, error) { u := fmt.Sprintf("%s/todo", apiRoot) return getItems(u) } ``` ##### 5.3 实现 list 命令 使用 Cobra 生成器添加 `list` 命令: ```bash $ cobra add list ``` 编辑 `cmd/list.go` 文件,更新导入部分,编辑命令实例定义,定义 `listAction` 函数和 `printAll` 函数。 ```go // apis/todoClient/cmd/list.go import ( "fmt" "io" "os" "text/tabwriter" "github.com/spf13/cobra" "github.com/spf13/viper" ) var listCmd = &cobra.Command{ Use: "list", Short: "List todo items", SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { apiRoot := viper.GetString("api-root") return listAction(os.Stdout, apiRoot) }, } func listAction(out io.Writer, apiRoot string) error { items, err := getAll(apiRoot) if err != nil { return err } return printAll(out, items) } func printAll(out io.Writer, items []item) error { w := tabwriter.NewWriter(out, 3, 2, 0, ' ', 0) for k, v := range items { done := "-" if v.Done { done = "X" } fmt.Fprintf(w, "%s\t%d\t%s\t\n", done, k+1, v.Task) } return w.Flush() } ``` #### 6. 测试客户端 测试 API 客户端时,直接连接到真实 API 存在困难,因此我们使用 `httptest.Server` 类型在本地模拟 API 进行测试。 ##### 6.1 定义模拟 API 资源 创建并编辑 `cmd/mock_test.go` 文件,添加包定义和导入列表,定义模拟响应数据和模拟服务器函数。 ```go // apis/todoClient/cmd/mock_test.go package cmd import ( "net/http" "net/http/httptest" ) var testResp = map[string]struct { Status int Body string }{ "resultsMany": { Status: http.StatusOK, Body: `{ "results": [ { "Task": "Task 1", "Done": false, "CreatedAt": "2019-10-28T08:23:38.310097076-04:00", "CompletedAt": "0001-01-01T00:00:00Z" }, { "Task": "Task 2", "Done": false, "CreatedAt": "2019-10- ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

【深度解析】PowerBuilder字符串提取利器——正则表达式你真的会用吗?

![正则表达式](https://www.freecodecamp.org/news/content/images/2023/07/unmatch-vowels.png) # 摘要 本文系统探讨了在PowerBuilder环境下应用正则表达式进行字符串处理的技术路径与实践方法。针对PowerBuilder在字符串处理方面的局限性,本文分析了正则表达式的基础理论、集成方式及其对象模型设计,深入讲解了在多种实际场景中(如日志分析与HTML解析)的字符串提取技巧,并讨论了结果的结构化输出方案。同时,文章进一步探讨了正则表达式在复杂模式匹配、大数据量处理中的优化策略及高级应用案例,并结合调试技巧

从零理解图像MTF评估:斜边法全场景应用深度剖析

![图像斜边计算MTF_matlab](https://i0.hdslb.com/bfs/archive/e393ed87b10f9ae78435997437e40b0bf0326e7a.png@960w_540h_1c.webp) # 摘要 本文系统阐述了图像调制传递函数(MTF)评估的基本原理及其关键测量方法——斜边法的理论基础与实现流程。围绕斜边法的核心机制,文章详细解析了从图像采集、预处理到算法实现的全过程,并探讨了多种影响MTF测量精度的因素及优化策略。同时,本文结合实际应用场景,展示了斜边法在消费电子、工业检测及高端成像领域的广泛应用,并展望了未来MTF评估技术的发展方向,包

泵浦光匹配建模全解析:MATLAB中耦合效率提升的4个关键点(实战案例)

![泵浦光匹配建模全解析:MATLAB中耦合效率提升的4个关键点(实战案例)](https://img-blog.csdnimg.cn/img_convert/904c8415455fbf3f8e0a736022e91757.png) # 摘要 泵浦光匹配建模在光纤激光器与光学系统设计中具有关键作用,直接影响光束耦合效率与系统整体性能。本文系统阐述了泵浦光匹配建模的基本概念与研究意义,深入分析其理论基础,包括光纤耦合原理、高斯光束传播特性及耦合效率的数学建模。基于MATLAB平台,介绍了光学仿真工具的使用与建模环境搭建方法,并提出四种关键建模策略以提升耦合效率。通过典型实例验证模型有效性

MySQL备份与恢复全攻略:保障数据安全的10个关键步骤

![MySQL备份与恢复全攻略:保障数据安全的10个关键步骤](https://www.ubackup.com/enterprise/screenshot/en/others/mysql-incremental-backup/incremental-backup-restore.png) # 摘要 MySQL数据库的备份与恢复是保障数据安全性与业务连续性的核心环节。本文系统阐述了MySQL备份与恢复的核心概念、理论基础与实践方法,涵盖物理备份与逻辑备份的机制、策略设计原则及自动化实现路径。文章深入解析了InnoDB热备、二进制日志应用、RTO与RPO指标等关键技术要素,并结合实战操作说明

非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用

![非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用](https://img-blog.csdnimg.cn/2020112915251671.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NodWlkaWRlaHVheWlyZW4=,size_16,color_FFFFFF,t_70) # 摘要 红白噪声检验在非平稳信号处理中具有重要作用,是识别信号中噪声成分、提升分析精度的关键技术。本文系统阐述了红白噪声的基本

逻辑分析仪实战指南:STM32时序问题精准定位技巧(硬件调试利器)

![逻辑分析仪实战指南:STM32时序问题精准定位技巧(硬件调试利器)](https://img-blog.csdnimg.cn/aebdc029725b4c9fb87efa988f917f19.png) # 摘要 本文系统探讨了逻辑分析仪在STM32嵌入式开发中的关键作用,特别是其在时序问题识别与调试中的应用。首先介绍了逻辑分析仪的基本原理及其与STM32调试的结合价值,随后详细分析了其核心功能、配置方法及与调试环境的集成方式。文章进一步阐述了如何利用逻辑分析仪捕获和分析STM32中常见的通信失败、中断延迟等时序问题,并结合自动化脚本与插件提升分析效率。最后,通过多个实际项目案例展示了

DHT11异常复位难题破解:STM32H7平台底层驱动+电源设计深度剖析

![STM32H743驱动DHT11数字温湿度传感器【支持STM32H7系列单片机_HAL库驱动】.zip](https://khuenguyencreator.com/wp-content/uploads/2021/07/stm32-dht11.jpg) # 摘要 DHT11传感器在嵌入式系统中广泛应用,但其在实际使用过程中常出现异常复位问题,影响数据采集的稳定性与可靠性。本文以基于STM32H7平台的应用为研究对象,系统分析了DHT11异常复位的现象与背景,深入剖析其通信协议、驱动机制及异常处理策略。进一步从硬件电源设计角度探讨了供电稳定性对传感器复位行为的影响,并结合软硬件协同调试

DMA中断与SPI外设冲突排查实战:快速定位问题的6大技巧

![stm32F407 SPI1/SPI2 DMA 方式读写 CH376S](https://img-blog.csdnimg.cn/direct/10c17a74ab934a1fa68313a74fae4107.png) # 摘要 本文系统性地探讨了DMA与SPI技术的基础原理、协同工作机制及其在实际应用中可能出现的中断冲突问题。通过对DMA传输机制与SPI通信协议的深入解析,结合嵌入式系统中的典型应用场景,文章重点分析了中断优先级配置、资源竞争以及时序不匹配等引发冲突的关键因素。在此基础上,提出了基于日志分析、逻辑波形捕获和分段隔离法的高效问题排查技巧,并结合实际案例展示了中断优先级

低耗SDK设计指南:移动环境下电量与流量控制技巧

![低耗SDK设计指南:移动环境下电量与流量控制技巧](https://img-blog.csdnimg.cn/direct/8979f13d53e947c0a16ea9c44f25dc95.png) # 摘要 随着移动应用功能日益复杂,资源消耗问题成为影响用户体验和应用性能的关键因素。本文系统研究了移动应用开发中的电量与流量优化问题,深入分析了移动设备电量消耗的主要来源与流量控制机制,探讨了Android与iOS平台在电量管理上的差异,并提出了基于用户行为的流量预测模型与优化策略。针对低耗SDK的开发实践,本文设计了模块化架构与自适应调控算法,并通过性能测试与A/B对比验证了优化效果。

插件化架构设计解析:iFIAS+如何实现灵活扩展与模块解耦(架构师进阶篇)

![插件化架构设计解析:iFIAS+如何实现灵活扩展与模块解耦(架构师进阶篇)](https://img-blog.csdnimg.cn/direct/592bac0bdd754f2cbfb7eed47af1d0ef.png) # 摘要 本文围绕插件化架构的设计理念与工程实践展开,重点介绍iFIAS+架构的核心机制与应用价值。首先阐述插件化架构的基本组成与设计原则,深入解析iFIAS+在模块化、接口抽象与服务注册方面的实现逻辑。随后通过iFIAS+的模块化设计实践,探讨插件的开发规范、加载机制、热更新策略及版本管理方案。结合实际业务场景,分析该架构在订单处理、支付扩展、性能优化及安全管理