55

golang实现注册与登录Server

 5 years ago
source link: https://studygolang.com/articles/16858?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

此demo的代码已上传GitHub

简单的注册与登录Server

⒈ 我们先看RunServer函数:

func RunServer() {
    http.HandleFunc("/login", login)       //登录
    http.HandleFunc("/register", register) //注册
    if err := http.ListenAndServe(":9000", nil); err != nil {
        fmt.Println("监听失败")
    }
}

其中使用HandlerFunc与ListenAndServe函数需要使用官方http包,需要导入import "http";接下来看看这两个函数;

HandleFunc函数原型:

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

其中:

第一个参数pattern就像是路径,但这儿跟路径又不同,也就是这里如果写了/register,那么在访问的时候需要使用,你部署这个Server的地址,如果是本地写127.0.0.1然后是冒号:端口号,最后就是设置的pattern值:127.0.0.1:9000/register;

第二个参数handler是一个回调函数,这个回调函数有两个形参,第一个形参是响应,也就是服务器可以给客户端发送信息,第二是请求,也就是服务器传过来的信息,像下面这种:

{

"method": "POST",

"transformRequest": [

null

],

"transformResponse": [

null

],

"url": " http://127.0.0.1:9000/login ",

"headers": {

"Content-Type": "application/json",

"Accept": "application/json, text/plain, / "

},

"data": "{"Username":"wutiange","Password":"123456"}",

"timeout": {}

}

我们可以通过第二个参数得到这里面的值,特别是data里面的数据。

ListenAndServe函数:

第二参数一般都是nil,第一个参数也就是地址,比如说:127.0.0.1:9000,如果像我上面那样写就代表着任何IP都可以访问,只要端口号对应,这个函数返回error,如果error不等于nil就代表失败;

这个函数的原型为:

func ListenAndServe(addr string, handler Handler) error

⒉ 接下来看回调函数

func register(res http.ResponseWriter, req *http.Request) {
    if req.Method == "POST" { //判断是不是POST请求
        s, _ := ioutil.ReadAll(req.Body) //读取数据
        Register(s)                      //注册
        res.Write(Feedbook(status))      //注册的结果反馈给用户
    } else {
        res.Write([]byte("{\"false\":\"只支持POST方式\"}"))
    }
}

就看注册的这一个,其中

① req.Method查看的是使用哪一种方式,一般是GET或POST;

② s, _ := ioutil.ReadAll(req.Body) 将io中的数据转换成[]bu=byte;

③ res.Write(Feedbook(status)) 这个函数就是将里面的信息反馈给客户端,参数是一个[]byte;

⒊ 接下来我们看Register函数

func Register(userInfo []byte) {
    var user User
    json.Unmarshal(userInfo, &user) //将json转换成结构体
    if Existed(user) {              //判断是否已经注册过
        status = Status{false, "用户名已存在"} //将状态回馈信息写入
        return                           //一旦失败,程序就没必要再执行了
    }
    user.Id = userId
    userId += 1
    userArr = append(userArr, user) //将这个用户的信息保存到切片中
    status = Status{true, "注册成功"}
}

这个函数里面主要就是一些简单逻辑的处理,我需要说明的是将json转换成struct的函数Unmarshal,这个函数接收两个参数,第一个是[]byte,第二个是要将转换的结果保存到哪儿,我这里是保存到结构体中,所以写结构体的地址,这里需要就是地址,无论转换成什么都需要取地址,除非本来就是指针;与这个函数对应的是Marshal,这个函数是将golang里面的结构体,map,切片转换成json,这个函数只有一个参数,也就是一个上面三种中的变量,这里不需要取址,类型写的是空接口,但也不要将其他的传入到这个中;

注意:这两个json转换的函数,在对待struct的时候,需要结构体里面的属性首字母大写,否则会出现得到的是空,主要原因应该是外部访问,在golang中就是需要将其写成大写;

Marshal函数的实例在Feedbook函数中;

你可以将我GitHub上的代码拷贝下面进行测试,也可以使用导入我的包进行测试,导入GitHub上的包,我写的有教程,请戳 golang导入GitHub中的包 ;下面是我测试的代码:

package main

import "github.com/wutiange/go/simpleHttp"

func main() {
    simpleHttp.RunServer()
}

看到上面的测试代码了没,只需要简单几行;请注意包的问题,如果有遇到包的问题,看我好友的教程 Golang学习笔记之包(package)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK