转载自: http://xiaorui.cc/2014/10/25/%e5%85%b3%e4%ba%8ego%e8%af%ad%e8%a8%80%e5%9c%a8%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%81%9arestful%e6%8e%a5%e5%8f%a3%e5%92%8csocket%e9%80%9a%e4%bf%a1/
关于Go语言在服务端做Restful接口和socket通信
下图是关于rest的使用介绍,有些老生常谈了。
当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现,而且对于使用REST开发的应用程序更加容易扩展。
其实说白了,就是根据不同的方法,来分类不同的任务~
我这边使用golang的drone/routes库实现restful服务。 下面是实现rest的具体事例代码。
packagemain
import (
"fmt"
"github.com/drone/routes"
"net/http"
)
funcgetuser(whttp.ResponseWriter,r *http.Request){
params:=r.URL.Query()
uid:=params.Get(":uid")
fmt.Fprintf(w,"you are get user %s",uid)
}
func modifyuser(whttp.ResponseWriter,r *http.Request){
params:=r.URL.Query()
uid:=params.Get(":uid")
fmt.Fprintf(w,"you are modify user %s",uid)
}
funcdeleteuser(whttp.ResponseWriter,r *http.Request){
params:=r.URL.Query()
uid:=params.Get(":uid")
fmt.Fprintf(w,"you are delete user %s",uid)
}
func adduser(whttp.ResponseWriter,r *http.Request){
params:=r.URL.Query()
uid:=params.Get(":uid")
fmt.Fprint(w,"you are add user %s",uid)
fmt.Printf("you are add user %s",uid)
}
funcmain(){
mux:=routes.New()
mux.Get("/user/:uid",getuser)
mux.Post("/user/:uid",modifyuser)
mux.Del("/user/:uid",deleteuser)
mux.Put("/user/:uid",adduser)
http.Handle("/",mux)
http.ListenAndServe(":8088",nil)
}
//xiaorui.cc
下面说下golang socket的实例代码, 这边针对每个请求都使用协程处理请求。
server.go
packagemain
import (
"fmt"
"net"
"os"
)
funcmain(){
var(
host = "127.0.0.1"
port = "8080"
remote= host+ ":"+ port
data = make([]byte,1024)
)
fmt.Println("Initiating server... (Ctrl-C to stop)")
lis,err :=net.Listen("tcp",remote)
defer lis.Close()
iferr !=nil {
fmt.Println("Error when listen: ",remote)
os.Exit(-1)
}
for{
var resstring
conn,err :=lis.Accept()
iferr !=nil {
fmt.Println("Error accepting client: ",err.Error())
os.Exit(0)
}
go func(connet.Conn){
fmt.Println("New connection: ", con.RemoteAddr())
for{
length,err :=con.Read(data)
iferr !=nil {
fmt.Printf("Client %v quit.\n", con.RemoteAddr())
con.Close()
return
}
res= string(data[0:length])
fmt.Printf("%s said: %s\n",con.RemoteAddr(),res)
res= "You said:"+ res
con.Write([]byte(res))
}
}(conn)
}
}
packagemain
import (
"fmt"
"net"
"os"
)
varstr string
var msg= make([]byte,1024)
funcmain(){
var(
host = "127.0.0.1"
port = "8080"
remote= host+ ":"+ port
)
con,err :=net.Dial("tcp",remote)
defer con.Close()
iferr !=nil {
fmt.Println("Server not found.")
os.Exit(-1)
}
fmt.Println("Connection OK.")
for{
fmt.Printf("Enter a sentence:")
fmt.Scanf("%s\n",&str)
ifstr =="quit" {
fmt.Println("Communication terminated.")
os.Exit(1)
}
in,err :=con.Write([]byte(str))
iferr !=nil {
fmt.Printf("Error when send to server: %d\n",in)
os.Exit(0)
}
length,err :=con.Read(msg)
iferr !=nil {
fmt.Printf("Error when read from server.\n")
os.Exit(0)
}
str= string(msg[0:length])
fmt.Println(str)
}
}