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 οnclick="send();">Send Message</button> </body> </html>