go-rest - 一个小型的Go REST框架(go-resty context deadline)

网友投稿 1158 2022-10-10

go-rest - 一个小型的Go REST框架(go-resty context deadline)

go-rest - 一个小型的Go REST框架(go-resty context deadline)

go-rest A small and evil REST framework for Go

Reflection, Go structs, and jsON marshalling FTW!

go get github.com/ungerik/go-restimport "github.com/ungerik/go-rest"Documentation: http://go.pkgdoc.org/github.com/ungerik/go-restLicense: Public Domain

Download, build and run example:

go get github.com/ungerik/go-restgo install github.com/ungerik/go-rest/example && example

Small?

Yes, the framework consists of only three functions: HandleGET, HandlePOST, RunServer.

Evil?

Well, this package can be considered bad design because HandleGET and HandlePOST use dynamic typing to hide 36 combinations of handler function types to make the interface easy to use. 36 static functions would have been more lines of code but dramatic simpler in their individual implementations. So simple in fact, that there wouldn't be a point in abstracting them away in an extra framework. See this great talk about easy vs. simple: http://infoq.com/presentations/Simple-Made-Easy Rob Pike may also dislike this approach: https://groups.google.com/d/msg/golang-nuts/z4T_n4MHbXM/jT9PoYc6I1IJ So yes, this package can be called evil because it is an anti-pattern to all that is good and right about Go.

Why use it then? By maximizing dynamic code it is easy to use and reduces code. Yes, that introduces some internal complexity, but this complexity is still very low in absolute terms and thus easy to control and debug. The complexity of the dynamic code also does not spill over into the package users' code, because the arguments and results of the handler functions must be static typed and can't be interface{}.

Now let's have some fun:

HandleGET uses a handler function that returns a struct or string to create the GET response. Structs will be marshalled as JSON, strings will be used as body with auto-detected content type.

Format of GET handler:

func([url.Values]) ([struct|*struct|string][, error]) {}

Example:

type MyStruct struct { A in B string}rest.HandleGET("/data.json", func() *MyStruct { return &MyStruct{A: 1, B: "Hello World"}})rest.HandleGET("/index.html", func() string { return "

Hello World"})

The GET handler function can optionally accept an url.Values argument and return an error as second result value that will be displayed as 500 internal server error if not nil.

Example:

rest.HandleGET("/data.json", func(params url.Values) (string, error) { v := params.Get("value") if v == "" { return nil, errors.New("Expecting GET parameter 'value'") } return "value = " + v, nil})

HandlePOST maps POST form data or a JSON document to a struct that is passed to the handler function. An error result from handler will be displayed as 500 internal server error message. An optional first string result will be displayed as a 200 response body with auto-detected content type.

Format of POST handler:

func([*struct|url.Values]) ([struct|*struct|string],[error]) {}

Example:

rest.HandlePOST("/change-data", func(data *MyStruct) (err error) { // save data return err})

Both HandleGET and HandlePOST also accept one optional object argument. In that case handler is interpreted as a method of the type of object and called accordingly.

Example:

rest.HandleGET("/method-call", (*myType).MethodName, myTypeObject)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:我给pyecharts绘制的“时间轮播图”,加上了好玩儿的“图形标志”!
下一篇:Python基础系列N讲 | 1500字详解Anaconda安装教程(附安装包)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~