【golang】http请求代码

一. 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)
	}
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值