在golang中寫一個http web伺服器大緻是有兩種方法:
1 使用net包的net.listen來對端口進行監聽
2 使用net/http包
這裡是讨論如何使用net/http包建立一個web伺服器
net/http請求提供了http用戶端和服務端的具體實作
先看到的是get,post,postform三個函數。這三個函數直接實作了http用戶端
1
2
3
4
5
6
7
8
9
10
11
12
<code>import (</code>
<code> </code><code>"fmt"</code>
<code> </code><code>"net/http"</code>
<code> </code><code>"io/ioutil"</code>
<code>)</code>
<code>func main() {</code>
<code> </code><code>defer response.body.close()</code>
<code> </code><code>body,_ := ioutil.readall(response.body)</code>
<code> </code><code>fmt.println(</code><code>string</code><code>(body))</code>
<code>}</code>
<code> </code>
除了使用這三個函數來建立一個簡單用戶端,還可以使用:
http.client和http.newrequest來模拟請求
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>package main</code>
<code> </code><code>client := &http.client{}</code>
<code> </code>
<code> </code><code>reqest.header.set(</code><code>"accept"</code><code>,</code><code>"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"</code><code>)</code>
<code> </code><code>reqest.header.set(</code><code>"accept-charset"</code><code>,</code><code>"gbk,utf-8;q=0.7,*;q=0.3"</code><code>)</code>
<code> </code><code>reqest.header.set(</code><code>"accept-encoding"</code><code>,</code><code>"gzip,deflate,sdch"</code><code>)</code>
<code> </code><code>reqest.header.set(</code><code>"accept-language"</code><code>,</code><code>"zh-cn,zh;q=0.8"</code><code>)</code>
<code> </code><code>reqest.header.set(</code><code>"cache-control"</code><code>,</code><code>"max-age=0"</code><code>)</code>
<code> </code><code>reqest.header.set(</code><code>"connection"</code><code>,</code><code>"keep-alive"</code><code>)</code>
<code> </code><code>response,_ := client.do(reqest)</code>
<code> </code><code>if</code> <code>response.statuscode == 200 {</code>
<code> </code><code>body, _ := ioutil.readall(response.body)</code>
<code> </code><code>bodystr := </code><code>string</code><code>(body);</code>
<code> </code><code>fmt.println(bodystr)</code>
<code> </code><code>}</code>
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iN2YjM4UTO1EjM4EjNwITMwIzLcZDMyEDMy8CXyETNmpWevwVbvN2Xzd2bsJmbj9CXt92YuM3ZvxmYuNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.png)
http包封裝地非常bt,隻需要兩行!!:
<code>func sayhello(w http.responsewriter, req *http.request) {</code>
<code> </code><code>w.write([]</code><code>byte</code><code>(</code><code>"hello"</code><code>))</code>
<code> </code><code>http.handlefunc(</code><code>"/hello"</code><code>, sayhello)</code>
<code> </code><code>http.listenandserve(</code><code>":8001"</code><code>, nil)</code>
進行端口的監聽:http.listenandserve(":8001", nil)
注冊路徑處理函數:http.handlefunc("/hello", sayhello)
處理函數:func sayhello(w http.responsewriter, req *http.request)
看看這個文章:
<a href="http://groups.google.com/group/golang-nuts/browse_thread/thread/cde2cc6278cefc90">http://groups.google.com/group/golang-nuts/browse_thread/thread/cde2cc6278cefc90</a>
node.js is 45% faster than golang(确實傷心)
golang服務端的效率确實沒有node.js高,幾乎是它的一半。但話說回來,如果一些并發量不是很大的site,還是可以使用golang做伺服器的。