Coder Social home page Coder Social logo

restdemo's Introduction

用 Golang 快速开发 RESTful API

这是我 2018 年一个演讲上用的 demo,用 golang 实现一个五脏俱全的 API 项目。

计划大概写一篇博客做说明,但是还没抽出空来写,可以看当时的演讲 PPT ,大概只是个 提纲。项目根目录有个 PDF 文件就是。

2021年6月10日:

我看到偶尔还有同学通过PPT或者视频来到这个repo,这是三年前的代码,虽然各种原理和写法可以对着演讲参考, 但是代码本身和它的依赖都已经过时了。大家看个意思就好,这些年来,我也有很多新的经验,它都被反映在了我新的项目中。

这里有一个开源项目是我一直维护着的,代码也比较简洁,大家可以去看这个项目学习:

https://github.com/hack-fan/skadi

使用方法

只要安装了 docker ,并开启了 Swarm 模式,在项目目录执行:

docker stack deploy -c docker-compose.yml demo

如果安装了 make , 也可以直接 make up,会自动帮你执行以上语句。

然后访问 your-host:1328/swagger/index.html 可以看到所有的 api

如果没有开放 swarm 模式,也可以自行改改 compose 文件用 docker-compose 启动.

关于项目组织

开发微服务的时候,建议不用建太多文件夹来横向分层。尽量把同一个实体的模型和业务逻 辑全放一个文件里其实是最利于代码维护的。因为微服务项目每个服务维护的实体其实很少 ,所以并不会很乱。

现在文件看起来比较乱是因为有太多的公用模块,业务逻辑只有 note.go 一个文件。但 是实际上,真的写微服务的时候,最好做一个自己的公用 package,剩下的文件大部分就都 是业务文件了。可以参考我的 xske 这两个 demo

一些更新

还没有体现在这个 demo 里

  • uuid 库我现在已经弃用,更喜欢用 xid
  • 日志库 zap 比 logrus 更好
  • swag 其实可以把展示统一维护在项目之外,在 ci 的时候生成 json 文件,业务代码里 只有注释,不用提供 swagger 的 endpoint ,这样是侵入最小的。

restdemo's People

Contributors

hyacinthus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

restdemo's Issues

ISSUE Invalid key in the request header

很感謝有這個範例,減少重覆學習所浪費的時間,學到一些東西,並且了解一些實際做法,希望能再更多新的東西和完整一些。

錯誤訊息

{"time":"2019-09-03T15:10:55.7714139+08:00","level":"ERROR","prefix":"echo","file":"error.go","line":"50","message":"code=400, message=Invalid key in the request header"}

需要補上KeyLookup 和 AuthScheme這兩個部份,按照實際使用的方式

	e.Use(middleware.KeyAuthWithConfig(middleware.KeyAuthConfig{
		Skipper:    skipper, // 跳过验证条件 在 auth.go 定义
		KeyLookup:  "header:" + echo.HeaderAuthorization,
		AuthScheme: "bearer",
		Validator:  validator, // 处理验证结果 在 auth.go 定义
	}))

以REST Client做法

GET {{baseUrl_localhost}}/xxxxxxxxxx
Authorization: bearer {{token}}
Content-Type: application/json

{
}

ISSUE msgpack: Decode(nonsettable *main.Token

setcc 正常執行,但getcc取出時會出現下面錯誤,trace後發現不出原因,使用的go-redis/cache 寫法看不出問題在那。

err := getcc("token:"+token, t)

2019/09/03 17:00:54 cache: key="token:fa45062f-ce28-11e9-82b0-1831bf44f9e4" Unmarshal(*main.Token) failed: msgpack: Decode(nonsettable *main.Token)
{"time":"2019-09-03T17:00:54.5674963+08:00","level":"ERROR","prefix":"echo","file":"error.go","line":"50","message":"msgpack: Decode(nonsettable *main.Token)"}

在cache.go

func getcc(key string, pointer interface{}) error {
	var t Token
	return cc.Get(key, &t)
}

Error
{
  "error": "ServerError",
  "message": "runtime error: invalid memory address or nil pointer dereference"
}
func getcc(key string, pointer interface{}) error {
	var t *Token
	return cc.Get(key, &t)
}

Error
{
  "error": "ServerError",
  "message": "runtime error: invalid memory address or nil pointer dereference"
}

auth.go

func validator(token string, c echo.Context) (bool, error) {
...
	var t0 Token
	cc.Get("token:"+"d7da50a1-ce2d-11e9-8ebd-1831bf44f9e4", &t0)
	fmt.Println(t0)
可以,成功
{d7da50a1-ce2d-11e9-8ebd-1831bf44f9e4 2019-09-07 17:33:10.1906513 +0800 CST 1}

	var t1 *Token
	cc.Get("token:"+"d7da50a1-ce2d-11e9-8ebd-1831bf44f9e4", t1)
	fmt.Println(t1)
沒有錯誤,但t1值是nil,也不正確
<nil>

	// 寻找token
	var t *Token
	err := getcc("token:"+token, t)
失敗
{"time":"2019-09-03T18:14:33.6739732+08:00","level":"ERROR","prefix":"echo","file":"error.go","line":"50","message":"msgpack: Decode(nonsettable *main.Token)"}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.