在K8S APIServer的代码中,我们依赖一个名为go-restful的库来构建HTTP API。在学习K8S代码的过程中,要对这个库有所了解,才能更方便的了解如何构建APIServer的Restful服务。
Github上这个项目的地址是:
https://github.com/emicklei/go-restful .
我们还轻松找到了作者介绍使用方法的博客。
该职位的地址是:
http://ernestmicklei . com/2012/11/go-restful-first-work-example/
在这里,我们将简要翻译它,以帮助您学习。以下是翻译。
在前一篇文章中,我介绍了go-restful包的设计,它是由谷歌的go语言开发的,用于构建REST风格的网络服务。今天,我完成了这个包的实现,包括以下功能:
使用 Route 来创建 WebService,Route 是 HTTP Request 到 Go 函数的映射。每个 Route 都需要的信息包括 HTTP 请求方法(GET,POST,...),URL 路径(/users),MimeType以及其绑定的处理函数。处理函数的输入包括一个 Request 和一个 Response。Request 对象用来获取 Path 和 Query参数,Headers以及 Request Body(XML,JSON,...)。Response 对象用来设置 Status,Headers,以及 Response BodyRequest 和 Response 对象都可以使用标准库来在对象和XML或JSON之间进行转换。我们可以用一个简单的例子来演示上述过程。对用户对象进行CRUD操作的网络服务。我们首先在userservice目录中创建一个userservice.go文件。
packageuserserviceimport(" github . com/em icklei/go-restful " " log ")类型用户结构{ Id,名称字符串}
用户类型代表我们要操作的对象。
文件的下一部分是网络服务的应用编程接口定义。这些应用编程接口是路由对象的集合,它们定义了如何将传入的HTTP请求映射到相应的处理函数。
funcNew() *restful。web service { service:= new(restful。WebService)服务。路径(“/user”)。消费(休息。MIME_XML,restful。MIME_JSON)。生产(restful。MIME_XML,restful。MIME_JSON)服务。路线(服务。GET("/{user-id} ")。To(FindUser))服务。路线(服务。开机自检(" ")。至(UpdateUser))服务。路线(服务。PUT("/ {user-id} ")。到(CreateUser))服务。路线(服务。DELETE("/{user-id} ")。To(RemoveUser))返回服务}
首先,使用一个根网址来初始化所有路径的服务,并定义每个路由可以接收和响应的MIME类型。当然,这也可以为每条路线单独指定。然后,服务指定它可以提供哪些路径。函数调用GET(“/{ user-id }”)这里是编写方法(“GET”)的一种简单方法。路径(“/{user-id}”),它创建一个RouteBuilder对象。然后使用这个RouteBuilder对象指定相应的处理函数。
接下来是定义每条路由的处理功能。
funcFindUser(request*restful。请求,回应*宁静。响应){ id :=请求。PathParameter("user-id") //在这里,您将从某个持久性系统usr中获取用户:= & amp用户{Id: id,Name: "John Doe"}响应。WriteEntity(usr)}
Route的处理程序的方法声明都是相同的,包括Restful请求和响应,它们是成对的。请求是对http请求对象的封装,它提供了一些方便的方法。响应是对http响应编写器的封装。这种设计方法可以向开发人员开放底层的HTTP结构,也可以为开发人员提供一些通用的Restful函数,比如WriteEntity。WriteEntity函数检查请求的接受头,以确定响应的内容类型头,并确定使用哪种方法序列化对象(在本例中是用户对象)。
userservice.go文件的其余部分是剩余路由处理程序的定义。
funcUpdateUser(request *restful。请求,回应*宁静。响应){ usr :=新(用户)错误:=请求。ReadEntity(& amp;usr) //在这里,您将使用一些持久性system ferr = = nil { response }更新用户。WriteEntity(usr) } else{ response。WriteError(http。StatusInternalServerError,err)} } FunccreateUser(request * restful。请求,回应*宁静。响应){ usr :=用户{Id: request。path ParAmeter(" user-id ")} err:= request。ReadEntity(& amp;usr) //在这里,您将创建一个具有一些持久性的用户systemiferr = = nil { response。WriteEntity(usr) } else{ response。WriteError(http。StatusInternalServerError,err)} } Funcremove user(request * restful。请求,回应*宁静。回应){ //在这里您可以从某个持久性系统中删除该用户}
现在,我们已经完成了用户服务的定义和实现。下面的代码段演示了如何在应用程序中使用该服务。
package main import(" github . com/em icklei/go-restful " " log " " net/http " " user service ")func main(){ restful。Add(userservice。New())日志。致命(http。ListenAndServe(":8080 ",nil))}
服务启动后,我们可以使用以下方法进行测试:
默认的请求$ curl http://localhost:8080/users/12 & lt;?xml version="1.0 "编码="UTF-8 "?>。& lt用户>。& ltId>。12<。/Id & gt;& lt名称>。无名氏& lt/Name >& lt/User & gt;
带 Accpet 头部的请求$ curl http://localhost:9090/users/12-H ' Accept:application/JSON ' { Id ":" 12 "," Name": "John Doe"}
新建一个User对象$ curl http://localhost:9090/users-X POST-d ' { " Id ":" 32 "," Name ":" jemygraw " } '-H ' Content-Type:application/JSON ' & lt;?xml version="1.0 "编码="UTF-8 "?>。& lt用户>。& ltId>。32<。/Id & gt;& lt名称>。jemygraw<。/Name >& lt/User & gt;
新的一个User对象,要求返回JSON。$ curl http://localhost:9090/users-X POST-d ' { " Id ":" 32 "," Name ":" jemigraw " } '-H ' Content-Type:application/JSON '-H ' Accept:application/JSON ' { " Id ":" 32 "," Name ":" jemigraw " }
翻译:
本文的永久存储地址为:
https://github . com/jemygraw/TechDoc/blob/master/Go % E5 % BA % 93% E5 % AD % A6 % E4 % B9 % A0/2018-09-14% 20k 8s % 20% E4 % BE % 9D % E8 % B5 % 96% E5 % BA % 93% E4 % B8 % AD % E7 % 9A % 84 Go-restful % E6 % A1 % 86% E6 % 9E % B6 MD
1.《webservice框架 K8S APIServer依赖的go-restful WebService框架的简单使用》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《webservice框架 K8S APIServer依赖的go-restful WebService框架的简单使用》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1022965.html