go语言http设置及超时请求

go语言http设置及超时请求

2018-12-18 09:31:46 昨夜是今晨的开始open in new window 阅读数 1307更多

分类专栏: golangopen in new window

  1. package main
  2. import (
  3. "log"
  4. "net/http" //http 请求用
  5. "io" // io.Copy获取http请求状态用;HttpPost
  6. "os" // os.Stdout 取io.Copy 返回数据中的status;HttpPost用
  7. "io/ioutil" //处理http获取的数据转换用
  8. "strings" //HttpPost2中生成Post数据用
  9. "net/url" //HttpPost3中定义url.Values中使用到
  10. "time" //设置超时用
  11. "net"
  12. )
  13. var my_url = "http://c-dancer.com" //全局变量链接
  14. func main(){
  15. //HttpGet()
  16. HttpPost()
  17. //HttpPost2()
  18. //HttpPost3()
  19. }
  20. //net/http包中提供了Get/Head/Post/PostForm函数来发出http/https请求
  21. //通过get获取来http请求
  22. func HttpGet(){
  23. response,err := http.Get(my_url)
  24. if err!= nil { //如果访问不成功,url不存在则会进入改判断
  25. log.Println(err)
  26. return
  27. }
  28. defer response.Body.Close() //请求完了关闭回复主体
  29. body,err := ioutil.ReadAll(response.Body)
  30. log.Println(string(body))
  31. }
  32. //生成client 通过client的Do方法执行
  33. func HttpPost(){
  34. /* 生成client,参数默认;
  35. * 这个结构体有四个属性
  36. * Transport(RoundTrepper);指定执行的独立、单次http请求的机制
  37. * CheckRedirect(func(req *Request, via []*Request)err):指定处理重定向的策略,如果不为nil,客户端在执行重定向之前调用本函数字段.如果CheckRedirect 返回一个错误,本类型中的get方法不会发送请求,如果CheckRedirect为nil,就会采用默认策略:连续请求10次后停止;
  38. * jar(CookieJar):jar指定cookie管理器,若果为nil请求中不会发送cookie,回复中的cookie会被忽略
  39. * TimeOut(time.Duration):指定本类型请求的时间限制,为0表示不设置超时
  40. */
  41. //client := &http.Client{} 这里初始化了一个默认的client,并没有配置一些请求的设置
  42. //可以通过client中transport的Dail函数,在自定义Dail函数里面设置建立连接超时时长和发送接受数据超时
  43. client := &http.Client{
  44. Transport: &http.Transport{
  45. Dial: func(netw, addr string) (net.Conn, error) {
  46. conn, err := net.DialTimeout(netw, addr, time.Second*2) //设置建立连接超时
  47. if err != nil {
  48. return nil, err
  49. }
  50. conn.SetDeadline(time.Now().Add(time.Second * 2)) //设置发送接受数据超时
  51. return conn, nil
  52. },
  53. ResponseHeaderTimeout: time.Second * 2,
  54. },
  55. }
  56. reqest,err := http.NewRequest("POST",my_url,strings.NewReader("name=PostName")) //提交请求;用指定的方法,网址,可选的主体放回一个新的*Request
  57. reqest.Header.Set("Content-Type","application/x-www-form-urlencoded")
  58. if err != nil {
  59. panic(err)
  60. return
  61. }
  62. response,err := client.Do(reqest) //前面预处理一些参数,状态,Do执行发送;处理返回结果;Do:发送请求,
  63. defer response.Body.Close()
  64. stdout := os.Stdout //将结果定位到标准输出,也可以直接打印出来,或定位到其他地方进行相应处理
  65. _,err = io.Copy(stdout,response.Body) //将第二个参数拷贝到第一个参数,直到第二参数到达EOF或发生错误,返回拷贝的字节喝遇到的第一个错误.
  66. status := response.StatusCode //获取返回状态码,正常是200
  67. body,err := ioutil.ReadAll(response.Body)
  68. log.Println(string(body))
  69. log.Println(status)
  70. }
  71. //HTTP 包中POST 方法
  72. func HttpPost2(){
  73. //HTTP POST请求
  74. req,err := http.Post(my_url,"application/x-www-form-urlencoded",strings.NewReader("name=myname"))//这里定义链接和post的数据
  75. if err != nil {
  76. log.Println(err.Error())
  77. return
  78. }
  79. defer req.Body.Close()
  80. body,err := ioutil.ReadAll(req.Body)
  81. if err != nil {
  82. log.Println(err.Error())
  83. return
  84. }
  85. log.Println(string(body))
  86. }
  87. //使用HTTP包中PostForm方法;
  88. func HttpPost3(){
  89. req,err := http.PostForm(my_url,url.Values{"key":{"value"},"id":{"123"}})
  90. if err != nil {
  91. log.Println(err.Error())
  92. return
  93. }
  94. defer req.Body.Close()
  95. body,err := ioutil.ReadAll(req.Body)
  96. if err != nil {
  97. log.Println(err.Error())
  98. }
  99. log.Println(string(body))
  100. }
Last Updated:
Contributors: 刘荣杰