Go实现简单的RESTful_API

何为RESTful API

A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data.

A RESTful API – also referred to as a RESTful web service – is based on representational state transfer (REST) technology, an architectural style and approach to communications often used in web services development.

Wikipedia: 表征性状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。
Roy Fielding是HTTP协议(1.0版和1.1版)的主要设计者,事实上HTTP 1.1规范正是基于REST架构风格的指导原理来设计的。需要注意的是,REST是一种设计风格而不是标准,如果一个架构符合REST原则,我们就称它为RESTful架构。

gorilla/mux

golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系。实现简单功能也比较单一:

  1. 不支持正则路由, 这个是比较致命的
  2. 只支持路径匹配,不支持按照Method,header,host等信息匹配,所以也就没法实现RESTful架构

安装第三方安装包

go get -u github.com/gorilla/mux

实现

  1. 定义结构体,用户构造json
type Person struct {ID        string   `json:"id,omitemty"`Firstname string   `json:"firstname,omitempty"`Lastname  string   `json:"lastname,omitempty"`Address   *Address `json:"address,omitempty"`
}type Address struct {City     string `json:"city,omitempty"`Province string `json:"province,omitempty"`
}
  1. 接下来,定义一个全局变量,用于存储资源(数据):
var people []Person
  1. Get

获取所有person,这里我们叫people:

func GetPeople(w http.ResponseWriter, req *http.Request) {json.NewEncoder(w).Encode(people)
}

根据id获取person:

func GetPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for _, item := range people {if item.ID == params["id"] {json.NewEncoder(w).Encode(item)return}}json.NewEncoder(w).Encode(people)
}
  1. post

同样可以,通过post操作向服务器添加数据:

func PostPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)var person Person_ = json.NewDecoder(req.Body).Decode(&person)person.ID = params["id"]people = append(people, person)json.NewEncoder(w).Encode(people)
}
  1. Delete
func DeletePerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for index, item := range people {if item.ID == params["id"] {people = append(people[:index], people[index+1:]...)break}}json.NewEncoder(w).Encode(people)
}

完整代码

package mainimport ("encoding/json""log""net/http""github.com/gorilla/mux"
)type Person struct {ID        string   `json:"id,omitemty"`Firstname string   `json:"firstname,omitempty"`Lastname  string   `json:"lastname,omitempty"`Address   *Address `json:"address,omitempty"`
}type Address struct {City     string `json:"city,omitempty"`Province string `json:"province,omitempty"`
}var people []Person

// *******************************************************************>>
// Get
// 获取所有person
func GetPeople(w http.ResponseWriter, req *http.Request) {json.NewEncoder(w).Encode(people)
}

// 根据id获取person
func GetPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for _, item := range people {if item.ID == params["id"] {json.NewEncoder(w).Encode(item)return}}json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************

// *******************************************************************>>
// Post
// 通过post操作向服务器添加数据
func PostPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)var person Person_ = json.NewDecoder(req.Body).Decode(&person)person.ID = params["id"]people = append(people, person)json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************

// *******************************************************************>>
// Delete
// 根据id进行删除操作
func DeletePerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for index, item := range people {if item.ID == params["id"] {people = append(people[:index], people[index+1:]...)break}}json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************func main() {people = append(people, Person{ID: "1", Firstname: "xi", Lastname: "dada", Address: &Address{City: "Shenyang", Province: "Liaoning"}})people = append(people, Person{ID: "2", Firstname: "li", Lastname: "xiansheng", Address: &Address{City: "Changchun", Province: "Jinlin"}}) // Get handle function:router := mux.NewRouter()router.HandleFunc("/people", GetPeople).Methods("GET")router.HandleFunc("/people/{id}", GetPerson).Methods("GET") // Post handle functionrouter.HandleFunc("/people/{id}", PostPerson).Methods("POST") // Delete handle function:router.HandleFunc("/people/{id}", DeletePerson).Methods("DELETE") // 启动 API端口9899log.Fatal(http.ListenAndServe(":9899", router))
}

运行:

go run ***.go

或者编译成二进制运行

go build ***.go

然后在浏览器中测试

http://localhost:9899/people
[{"id":"1","firstname":"xi","lastname":"dada","address":{"city":"Shenyang","province":"Liaoning"}},{"id":"2","firstname":"li","lastname":"xiansheng","address":{"city":"Changchun","province":"Jinlin"}}
]

Go实现简单的RESTful_API相关推荐

  1. restful_api规范

    阮一峰的网络日志 » 首页 » 档案 上一篇:理解OAuth 2.0 下一篇:我的博客文集上架了! 分类: 开发者手册 RESTful API 设计指南 作者: 阮一峰 日期: 2014年5月22日 ...

  2. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  3. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  4. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  5. Docker的安装、镜像源更换与简单应用

    Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...

  6. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  7. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】

    博客目录(阅读时间:10分钟) 一.win10 0.系统环境 1. win10配置golang环境 ①下载相关软件 ②创建gowork工作空间 ③配置环境变量(GOPATH+PATH) ④验证环境配置 ...

  8. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  9. JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

    一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...

最新文章

  1. jupyter notebook快捷键总结及重要插件安装
  2. 社会工程学到底有多可怕
  3. 我理解的session和cookie
  4. Source Insight常用快捷键
  5. php cannot call constructor,安装ECshop普遍问题的解决方法
  6. Win-MASM64汇编语言-MOV/MOVSB/MOVSW/MOVSD/REP/REPZ/REPE/REPNZ/REPNE
  7. C#开发:openfiledialog的使用
  8. Autofs实现文件系统的自动mount
  9. Synchronous Bidirectional Inference for Neural Sequence Generation
  10. webpack入门+路由配置
  11. 零件缝隙平行线距离检测4
  12. paip.ollydbg 设置c++ qt API断点总结
  13. html表格基础及案例示图代码。
  14. 子网掩码和IP地址计算网络地址和广播地址的换算
  15. CuteFTP实用技巧
  16. 对算法的时间复杂度的理解
  17. matlab处理afm图片,基于MATLAB的增大页岩AFM灰度图分辨率的方法与流程
  18. Typora入门教学
  19. PHP,POST页面无法传值跳转,请大神帮助。
  20. 【LaTex】在 LaTex 中优雅地插入行内和行间代码

热门文章

  1. linux 搜索命令 历史,Linux 控制台神器:搜索历史命令 Ctrl + R ( ctrl + r to search the history command )...
  2. HTML用css让input无法使用,html – 是否可以使用CSS设置一个禁用的INPUT元素?
  3. linux 格式化 目录,Linux 磁盘分区、格式化、目录挂载
  4. java teechart怎么用_TeeChart使用范例
  5. java项目如何更改路径_Java修改eclipse中web项目的server部署路径问题
  6. java单词测试,java单词 - 在线打字测试(dazi.kukuw.com)
  7. window连接树莓派linux桌面,远程连接Raspberry Pi(树莓派)图形用户界面(X Window)
  8. ip地址合不合法怎么看_电子印章合不合法?两部门再发意见认定
  9. IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
  10. java中并不是任意多个接口都可以实现多实现