1139 字
6 分钟
02 获取地区信息
02 获取地区信息
获取地区信息服务(首页相关)
流程与接口
#Request:method: GETurl:api/v1.0/areas#data:no input data#Response#返回成功:{ "errno": 0, "errmsg":"OK", "data": [ {"aid": 1, "aname": "东城区"}, {"aid": 2, "aname": "西城区"}, {"aid": 3, "aname": "通州区"}, {"aid": 4, "aname": "顺义区"}] //...}#注册失败:{ "errno": "400x", //状态码 "errmsg":"状态错误信息"}![请求地域信息 apiv1 0areas [get]](/_astro/%E8%AF%B7%E6%B1%82%E5%9C%B0%E5%9F%9F%E4%BF%A1%E6%81%AF%20apiv1%200areas%20_get_.CYJouIu8_ZxKehp.webp)
创建命令
$ micro new --type "srv" sss/GetArearedis的使用
安装redis
#下载$ wget http://download.redis.io/releases/redis-5.0.3.tar.gz#解压$ tar xzf redis-5.0.3.tar.gz#进入$ cd redis-5.0.3#编译$ make#安装$ sudo make install#验证$ redis-cliCould not connect to Redis at 127.0.0.1:6379: Connection refusedCould not connect to Redis at 127.0.0.1:6379: Connection refusednot connected>redis启动
#将redis安装包的redis.conf文件复制到我们项目中ihome服务的conf文件当中#修改redis.conf文件#69行69 bind 127.0.0.1 当前主机ip#136行修改为yes表示守护进程启动 136 daemonize yes
#在ihome服务中创建一个启动文件$ vim server.sh#文件内容redis-server ./conf/redis.conf#给文件赋予启动权限$ chmod 777 server.sh安装go语言redis aip驱动
$ go get -v -u github.com/gomodule/redigo/redis$ go get -v -u github.com/garyburd/redigo`安装beego的cache缓存模块
$ go get github.com/astaxie/beego/cacheproto文件
service Example { rpc GetArea(Request) returns (Response) {}}
message Request {}
message Response { //返回错误码 string Errno = 1; //返回错误信息 string Errmsg = 2; //返回数据类型 message Address{ int32 aid = 1; string aname = 2; } //用自定义类型返回的数组 repeated Address Data = 3;}web服务main.go添加3条路由
//获取地区信息rou.GET("/api/v1.0/areas",handler.GetArea)//下面两个目前并不实现服务//获取sessionrou.GET("/api/v1.0/session",handler.GetSession)//获取indexrou.GET("/api/v1.0/house/index",handler.GetIndex)web服务handler.go添加三个客户端函数
//获取地区func GetArea(w http.ResponseWriter, r *http.Request,_ httprouter.Params) { beego.Info("获取地区请求客户端 url:api/v1.0/areas")
//创建新的grpc返回句柄 server :=grpc.NewService() //服务出初始化 server.Init()
//创建获取地区的服务并且返回句柄 exampleClient := GETAREA.NewExampleService("go.micro.srv.GetArea", server.Client())
//调用函数并且获得返回数据 rsp, err := exampleClient.GetArea(context.TODO(), &GETAREA.Request{}) if err != nil { http.Error(w, err.Error(), 502) return } //创建返回类型的切片 area_list := []models.Area{} //循环读取服务返回的数据 for _,value := range rsp.Data{ tmp :=models.Area{Id:int(value.Aid),Name:value.Aname,Houses:nil} area_list = append(area_list,tmp) } //创建返回数据map response := map[string]interface{}{ "errno": rsp.Errno, "errmsg": rsp.Errmsg, "data" : area_list, } //注意的点 w.Header().Set("Content-Type", "application/json")
// 将返回数据map发送给前端 if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), 503) return }}
//获取sessionfunc GetSession(w http.ResponseWriter, r *http.Request,_ httprouter.Params) { beego.Info("获取Session url:api/v1.0/session")
//创建返回数据map response := map[string]interface{}{ "errno": utils.RECODE_SESSIONERR, "errmsg": utils.RecodeText(utils.RECODE_SESSIONERR),
} w.Header().Set("Content-Type", "application/json")
// 将返回数据map发送给前端 if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), 503) return }}
//获取首页轮播func GetIndex(w http.ResponseWriter, r *http.Request,_ httprouter.Params) { beego.Info("获取首页轮播 url:api/v1.0/houses/index")
//创建返回数据map response := map[string]interface{}{ "errno": utils.RECODE_OK, "errmsg": utils.RecodeText(utils.RECODE_OK),
} w.Header().Set("Content-Type", "application/json")
// 将返回数据map发送给前端 if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), 503) return }}GetArea服务handler.go
package handlerimport ( "context"
"github.com/micro/go-log"
example "go-1/GetArea/proto/example" "github.com/astaxie/beego" "go-1/homeweb/utils" "encoding/json" "github.com/astaxie/beego/cache" _ "github.com/astaxie/beego/cache/redis" _ "github.com/gomodule/redigo/redis" "github.com/astaxie/beego/orm" "go-1/homeweb/models" "time")
func (e *Example) GetArea(ctx context.Context, req *example.Request, rsp *example.Response) error { beego.Info(" GetArea api/v1.0/areas !!!")
//初始化返回值 rsp.Errno = utils.RECODE_OK rsp.Errmsg = utils.RecodeText(rsp.Errno)
//连接redis创建句柄 redis_config_map := map[string]string{ "key":utils.G_server_name,
"conn":utils.G_redis_addr+":"+utils.G_redis_port, "dbNum":utils.G_redis_dbnum, } //确定连接信息 beego.Info(redis_config_map) //将map转化为json redis_config ,_:=json.Marshal(redis_config_map) //连接redis bm, err := cache.NewCache("redis", string(redis_config) ) if err != nil { beego.Info("缓存创建失败",err) rsp.Errno = utils.RECODE_DBERR rsp.Errmsg = utils.RecodeText(rsp.Errno) return nil } /*1获取缓存数据*/ areas_info_value:=bm.Get("areas_info") //如果不为空则说明成功 if areas_info_value !=nil{ beego.Info("获取到缓存发送给前端")
//用来存放解码的json ares_info := []map[string]interface{}{} //解码 err = json.Unmarshal(areas_info_value.([]byte),&ares_info)
//进行循环赋值 for key, value := range ares_info {
beego.Info(key,value) //创建对于数据类型并进行赋值 area := example.Response_Address{Aid :int32(value["aid"].(float64)), Aname :value["aname"].(string)}
//递增到切片 rsp.Data = append(rsp.Data,&area) }
return nil } beego.Info("没有拿到缓存")
/*2如果没有缓存我们就从mysql 里进行查询*/
//orm的操作创建orm句柄 o:=orm.NewOrm()
//接受地区信息的切片 var areas []models.Area //创建查询条件 qs:= o.QueryTable("area") //查询全部地区 num ,err :=qs.All(&areas) if err != nil { rsp.Errno = utils.RECODE_DBERR rsp.Errmsg = utils.RecodeText(rsp.Errno) return nil } if num == 0 { rsp.Errno = utils.RECODE_NODATA rsp.Errmsg = utils.RecodeText(rsp.Errno) return nil }
beego.Info("写入缓存")
/*3获取数据写入缓存*/
//将查询到的数据编码成json格式 ares_info_str,_:=json.Marshal(areas)
//Put(key string, val interface{}, timeout time.Duration) error //存入缓存中 err =bm.Put("areas_info",ares_info_str,time.Second*3600) if err != nil { beego.Info("数据库中查出数据信息存入缓存中失误",err) rsp.Errno = utils.RECODE_NODATA rsp.Errmsg = utils.RecodeText(rsp.Errno) return nil }
//返回地区信息 for key, value := range areas { beego.Info(key,value)
area := example.Response_Address{Aid :int32(value.Id), Aname :string(value.Name)} //var area example.ResponseArea_Address //area.Aid = value["aid"].(int32) //area.Aname = value["aname"].(string) rsp.Data = append(rsp.Data,&area) }
return nil}