Go的学习旅程9:Http,Web,websocket的简单实现

    golang的web运行效率还是和nginx相同,而且实现起来还是很简单的;

    简单的调用:

server

package main

import (
   "net/http"
   "fmt"
)

func hello(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintf(w, "Hello,世界!!")
}
func login(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintf(w, "请登陆!!!!")
}

func main() {
   http.HandleFunc("/", hello)
   http.HandleFunc("/login", login)
   //监听本机的8080端口
   http.ListenAndServe(":8080", nil)
}

    测试:

            

server-获取参数

     一、获取GET参数

package main

import (
   "net/http"
   "fmt"
)

func hello(w http.ResponseWriter, r *http.Request) {
   //ParseForm解析URL中的查询字符串,并将解析结果更新到r.Form字段。
   r.ParseForm()
   if len(r.Form["id"]) > 0 {
      fmt.Fprintln(w, r.Form["id"][0])
   }
   if len(r.Form.Get("id")) > 0 {
      fmt.Fprintln(w, r.Form.Get("id"))
   }
}

func main() {
   http.HandleFunc("/", hello)
   http.ListenAndServe(":8080", nil)
}

    二、获取POST参数

    2.1 获取单个POST字段值

package main

import (
   "net/http"
   "fmt"
)

func hello(w http.ResponseWriter, r *http.Request) {
   id := r.PostFormValue("id")
   fmt.Fprintln(w,id)
}

func main() {
   http.HandleFunc("/", hello)
   http.ListenAndServe(":8080", nil)
}

    2.2 获取多个POST字段值

package main

import (
   "net/http"
   "fmt"
)

func hello(w http.ResponseWriter, r *http.Request) {
   id := r.PostForm["id"]
   fmt.Fprintln(w,id)
}

func main() {
   http.HandleFunc("/", hello)
   http.ListenAndServe(":8080", nil)
}

    

    client-get

package main

import (
   "net/http"
   "io/ioutil"
   "fmt"
)

func main() {
   resp, err := http.Get("https://www.baidu.com/")
   if err != nil {
      panic(err)
   }
   data,err:=ioutil.ReadAll(resp.Body)
   fmt.Println(string(data))

}

    

    client-Post1

package main

import (
   "io/ioutil"
   "fmt"
   "strconv"
   "net/http"
   "strings"
)

func main() {
   id := "brandId=" + strconv.Itoa(33)
   resp, err := http.Post("https://j.autohome.com.cn/pcplatform/common/getSeriesInfo",
      "application/x-www-form-urlencoded",
      strings.NewReader(id))
   defer resp.Body.Close()
   if err != nil {
      panic(err)
   }
   data, err := ioutil.ReadAll(resp.Body)
   fmt.Println(string(data))
}


    client-Post2

package main

import (
   "io/ioutil"
   "fmt"
   "net/http"
   "net/url"
)

func main() {
   resp, err := http.PostForm("https://j.autohome.com.cn/pcplatform/common/getSeriesInfo",
      url.Values{"brandId":{"33"}})
   defer resp.Body.Close()
   if err != nil {
      panic(err)
   }
   data, err := ioutil.ReadAll(resp.Body)
   fmt.Println(string(data))
}

client这几种访问方式中,封装的很简单,而且效率也很不错,做为爬虫的第一语言还是不错的(golang一分钟上万条数据,而且还是没有开协程的情况下,不要和我说python,慢的一笔);


好的,现在说websocket,实现起来比较的简单,

直接上码

server.go

package main

import (
   "fmt"
   "golang.org/x/net/websocket"
   "net/http"
   "log"
   "time"
)

func Echo(ws *websocket.Conn) {
   var err error
   for {
      var Msg string
      //接收消息
      if err = websocket.Message.Receive(ws, &Msg); err != nil {
         fmt.Println("接收失败")
         break
      }
      fmt.Println("来自客户端的消息: " + Msg)
      //传递消息
      if err = websocket.Message.Send(ws, "现在时间是:"+time.Now().Format("2006-01-02 15:04:05")); err != nil {
         fmt.Println("Can't send")
         break
      }
   }
}

func main() {
   fmt.Println("Start app")
   http.Handle("/", websocket.Handler(Echo))
   if err := http.ListenAndServe(":8000", nil); err != nil {
      log.Fatal("ListenAndServe:", err)
   }
}

Index.html


<html>
<head></head>
<body>
<script type="text/javascript">
    var sock = null;
    var wsuri = "ws://127.0.0.1:8000";
    window.onload = function() {
        console.log("onload");
        sock = new WebSocket(wsuri);
        sock.onopen = function() {
            console.log("connected to " + wsuri);
        }
        sock.onclose = function(e) {
            console.log("connection closed (" + e.code + ")");
        }
        sock.onmessage = function(e) {
            console.log("message received: " + e.data);
        }
    };
    function send() {
        var msg = document.getElementById('message').value;
        sock.send(msg);
    }
</script>
<h1>WebSocket Echo Test</h1>
<form>
    <p>Message: <input id="message" type="text" value="Hello, world!"></p>
</form>
<button onclick="send();">Send Message</button>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/feiwutudou/article/details/80776518