API设计之http handler层

handler -> validation{1.request,2.user} -> business logic -> reponse .

四个步骤:

  1. handler 是request进来的第一个处理的模块
  2. 之后会做validation 校验,第一个校验request是否合法,第二个是校验用户是不是已经注册过的合法用户
  3. 做逻辑处理
  4. 得出最后的结果 reponse

validation(检验)

1.数据结构data model.

2.一旦出现问题返回的错误error handling.

在文件夹defs里面加入apidef.go 和errs.go

//apidef.go

package defs

//requsets
type UserCreadential struct{
	Username string `json:"user_name"`
	Pwd string `json:"pwd"`
}

//Go里面的原生方法处理json的一种方式
//是在struct打Tag的方式,Tag的名称是user_name ,Tag的属性是json
//在序列化和反序列化json的时候会自动转换成我们想要的东西
//{
//	user_name: xxx,
//	pwd: xxx
//}

Go里面的原生方法处理json的一种方式

是在struct打Tag的方式,Tag的名称是user_name ,Tag的属性是json

在序列化和反序列化json的时候会自动转换成我们想要的东西

{

​ user_name: xxx,

​ pwd: xxx

}

在errs.go里面

package defs

type Err struct{
	Error string `json:"error"`
	ErrorCode string `json:"error_code"`
}

type ErrorResponse struct{
	HttpSC int
	Error Err
}

var (
	ErrorRequestBodyParseFailed = ErrorResponse{HttpSC: 400,Error:Err{Error:"Request body is not correct",ErrorCode: "001"}}
    //request传进来的数据是没办法解析的
    //嵌套的对象
	ErrorNotAuthUser = ErrorResponse{HttpSC: 401,Error:Err{Error: "User authentication failed",ErrorCode: "002"}}
    //验证不通过,用户是不存在的
)

然后把第三步的business logic放在handler里面,然后通过handler去调用dbops

在dbops文件夹里面创建api.go

//api.go

package dbops

import (
	"database/sql"
)
//内部方法
func openConn() *sql.DB {

}

//Web方法 创建用户
func AddUserCrential(loginName string,pwd string) error {

}

func GetUserCredential(loginName string)(string,error) {

}

然后在大的API文件夹里面创建response.go

//response.go

package main

import (
	"io"
	"net/http"
)

func sendErrorResponse(w http.ResponseWriter) {

}

func sendNormalResponse(w http.ResponseWriter) {

}

整个分层结构

从main函数开始,然后进到handler,然后handler调用dbops,从dbops拿到信息,然后做进一步处理,在做进一步处理的过程中用到defs里面的比如消息的定义,一起组成response,最后调取response,将response发出来。

符合ERSTful API在架构上的建议。