您的位置:首页 > 理论基础 > 计算机网络

【GOLANG】http请求代码

2015-10-13 16:33 316 查看
一. http请求,设置超时
func Request(method, baseUrl, path string, body io.Reader) ([]byte, int, error) {
client := http.Client{
Transport: &http.Transport{
Dial: func(netw, addr string) (net.Conn, error) {
deadline := time.Now().Add(25 * time.Second)
c, err := net.DialTimeout(netw, addr, time.Second*20)
if err != nil {
return nil, err
}
c.SetDeadline(deadline)
return c, nil
},
},
}

url := fmt.Sprintf("%s%s", baseUrl, path)
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, 0, err
}

req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
return nil, 0, err
}

data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, 0, err
}
defer resp.Body.Close()
return data, resp.StatusCode, nil
}


二. goroutine 定时器


var exit = make(chan error)
tc := time.NewTicker(time.Second * 5)

go func() {
for {
select {
case <-tc.C:
exit <- fmt.Errorf("{request agent timeout}")
return
default:
data, code, err = Request("GET", httpHost, path, bytes.NewBuffer(nil))
if err != nil {
exit <- fmt.Errorf("{request agent error %v}", err)
return
}

if code != http.StatusOK {
exit <- fmt.Errorf("{request agent network abnormal}")
break
}

exit <- nil
return
}
}
}()

err = <-exit
if err != nil {
return RET_ERROR, fmt.Errorf("{request agent failed finally %v}", err)
}


三. 注册API handler

<span style="font-size:14px;">func startApiServer(engine *driver.Engine) error {
router := api.HandlerRouter(engine)
http.Handle("/", router)

addr := fmt.Sprintf(":%d", engine.Config.HTTPPort)
if err := http.ListenAndServe(addr, nil); err != nil {
return err
}

return nil
}</span>


var mRouter = map[string]map[string]func(*driver.Engine, http.ResponseWriter, *http.Request){
"GET": {
"db/queryuserinfo/{user_name}":                    getUserinfoByNameHandler,
"{user_id}/db/querylist":                          getUserHagroupsHandler,
"{user_id}/db/detail/{group_id}":                  getHagroupinfoHandler,
"db/monitor/alivestatus":                          getAliveStatusHandler,
"db/monitor/agentalivestatus/{start_id}/{end_id}": getAgentAliveStatusHandler,
"db/monitor/keystatus/{monitor_key}/{key_value}":  getMonitKeyStatusHandler,
"{user_id}/db/check/{group_name}":                 checkGroupNameHandler,
},

"POST": {
"{user_id}/db/create":                      createHagroupHandler,
"{user_id}/db/start/{group_id}":            startHagroupHandler,
"{user_id}/db/restart/{group_id}":          restartHagroupHandler,
"{user_id}/db/stop/{group_id}":             stopHagroupHandler,
"{user_id}/db/modify/{group_id}":           modifyHagroupInfoHandler,
"{user_id}/db/modify/cpuandmem/{group_id}": modifyHagroupCpuMemHandler,
//		"{user_id}/db/callback/create/{group_id}":  AgentCreateHgHandler,
//		"{user_id}/db/callback/delete/{group_id}":  AgentDeleteHgHandler,
},

"DELETE": {
"{user_id}/db/delete/{group_id}": deleteHagroupHandler,
},
}

func HandlerRouter(engine *driver.Engine) http.Handler {
router := mux.NewRouter()

for method, routes := range mRouter {
for route, fct := range routes {
localRoute := RVERSION + route
localMethod := method
handler := handlerRequest(engine, fct)
router.Path(localRoute).Methods(localMethod).HandlerFunc(handler)
}
}

router.NotFoundHandler = http.NotFoundHandler()
return router
}

func handlerRequest(engine *driver.Engine, handlerFunc func(*driver.Engine, http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
engine.Log.Info("server API handRequest: %s", r.URL)
handlerFunc(engine, w, r)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: