golang实现注册与登录Server

吴敬悦 · · 929 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

此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)


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:吴敬悦

查看原文:golang实现注册与登录Server

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

929 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传