请到我的个人博客看golang rest相关文章 http://xiaorui.cc
关于Go语言在服务端做Restful接口和socket通信
已经转到:
下图即是REST的架构图:
当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现,而且对于使用REST开发的应用程序更加容易扩展。
其实说白了,就是根据不同的方法,来分类不同的任务~
1
|
<span style=
"font-size:16px;"
>
package
main<br data-filtered=
"filtered"
>
import
(<br data-filtered=
"filtered"
>
"fmt"
<br data-filtered=
"filtered"
>
"github.com/drone/routes"
<br data-filtered=
"filtered"
>
"net/http"
<br data-filtered=
"filtered"
>)<br data-filtered=
"filtered"
>func getuser(w http.ResponseWriter, r *http.Request) {<br data-filtered=
"filtered"
> params := r.URL.Query()<br data-filtered=
"filtered"
> uid := params.Get(
":uid"
)<br data-filtered=
"filtered"
> fmt.Fprintf(w,
"you are get user %s"
, uid)<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
>func modifyuser(w http.ResponseWriter, r *http.Request) {<br data-filtered=
"filtered"
> params := r.URL.Query()<br data-filtered=
"filtered"
> uid := params.Get(
":uid"
)<br data-filtered=
"filtered"
> fmt.Fprintf(w,
"you are modify user %s"
, uid)<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
>func deleteuser(w http.ResponseWriter, r *http.Request) {<br data-filtered=
"filtered"
> params := r.URL.Query()<br data-filtered=
"filtered"
> uid := params.Get(
":uid"
)<br data-filtered=
"filtered"
> fmt.Fprintf(w,
"you are delete user %s"
, uid)<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
>func adduser(w http.ResponseWriter, r *http.Request) {<br data-filtered=
"filtered"
> params := r.URL.Query()<br data-filtered=
"filtered"
> uid := params.Get(
":uid"
)<br data-filtered=
"filtered"
> fmt.Fprint(w,
"you are add user %s"
, uid)<br data-filtered=
"filtered"
> fmt.Printf(
"you are add user %s"
, uid)<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
>
//xiaorui.cc<br data-filtered="filtered">func main() {<br data-filtered="filtered"> mux := routes.New()<br data-filtered="filtered"> mux.Get("/user/:uid", getuser)<br data-filtered="filtered"> mux.Post("/user/:uid", modifyuser)<br data-filtered="filtered"> mux.Del("/user/:uid", deleteuser)<br data-filtered="filtered"> mux.Put("/user/:uid", adduser)<br data-filtered="filtered"> http.Handle("/", mux)<br data-filtered="filtered"> http.ListenAndServe(":8088", nil)<br data-filtered="filtered">}<br data-filtered="filtered">//xiaorui.cc<br data-filtered="filtered"></span>
|
结果:
接着咱们再说下 go的socket 。
客户端的情况
服务端的情况:
server.go
1
|
<span style=
"font-size:16px;"
>
package
main<br data-filtered=
"filtered"
>
import
(<br data-filtered=
"filtered"
>
"fmt"
<br data-filtered=
"filtered"
>
"net"
<br data-filtered=
"filtered"
>
"os"
<br data-filtered=
"filtered"
>)<br data-filtered=
"filtered"
>func main() {<br data-filtered=
"filtered"
>
var
(<br data-filtered=
"filtered"
> host =
"127.0.0.1"
<br data-filtered=
"filtered"
> port =
"8080"
<br data-filtered=
"filtered"
> remote = host +
":"
+ port<br data-filtered=
"filtered"
> data = make([]byte,
1024
)<br data-filtered=
"filtered"
> )<br data-filtered=
"filtered"
> fmt.Println(
"Initiating server... (Ctrl-C to stop)"
)<br data-filtered=
"filtered"
> lis, err := net.Listen(
"tcp"
, remote)<br data-filtered=
"filtered"
> defer lis.Close()<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Println(
"Error when listen: "
, remote)<br data-filtered=
"filtered"
> os.Exit(-
1
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
>
for
{<br data-filtered=
"filtered"
>
var
res string<br data-filtered=
"filtered"
> conn, err := lis.Accept()<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Println(
"Error accepting client: "
, err.Error())<br data-filtered=
"filtered"
> os.Exit(
0
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> go func(con net.Conn) {<br data-filtered=
"filtered"
> fmt.Println(
"New connection: "
, con.RemoteAddr())<br data-filtered=
"filtered"
>
for
{<br data-filtered=
"filtered"
> length, err := con.Read(data)<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Printf(
"Client %v quit.\n"
, con.RemoteAddr())<br data-filtered=
"filtered"
> con.Close()<br data-filtered=
"filtered"
>
return
<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> res = string(data[
0
:length])<br data-filtered=
"filtered"
> fmt.Printf(
"%s said: %s\n"
, con.RemoteAddr(), res)<br data-filtered=
"filtered"
> res =
"You said:"
+ res<br data-filtered=
"filtered"
> con.Write([]byte(res))<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> }(conn)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
></span>
|
client.go
1
|
<span style=
"font-size:16px;"
>
package
main<br data-filtered=
"filtered"
>
import
(<br data-filtered=
"filtered"
>
"fmt"
<br data-filtered=
"filtered"
>
"net"
<br data-filtered=
"filtered"
>
"os"
<br data-filtered=
"filtered"
>)<br data-filtered=
"filtered"
>
var
str string<br data-filtered=
"filtered"
>
var
msg = make([]byte,
1024
)<br data-filtered=
"filtered"
>func main() {<br data-filtered=
"filtered"
>
var
(<br data-filtered=
"filtered"
> host =
"127.0.0.1"
<br data-filtered=
"filtered"
> port =
"8080"
<br data-filtered=
"filtered"
> remote = host +
":"
+ port<br data-filtered=
"filtered"
> )<br data-filtered=
"filtered"
> con, err := net.Dial(
"tcp"
, remote)<br data-filtered=
"filtered"
> defer con.Close()<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Println(
"Server not found."
)<br data-filtered=
"filtered"
> os.Exit(-
1
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> fmt.Println(
"Connection OK."
)<br data-filtered=
"filtered"
>
for
{<br data-filtered=
"filtered"
> fmt.Printf(
"Enter a sentence:"
)<br data-filtered=
"filtered"
> fmt.Scanf(
"%s\n"
, &str)<br data-filtered=
"filtered"
>
if
str ==
"quit"
{<br data-filtered=
"filtered"
> fmt.Println(
"Communication terminated."
)<br data-filtered=
"filtered"
> os.Exit(
1
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
>
in
, err := con.Write([]byte(str))<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Printf(
"Error when send to server: %d\n"
,
in
)<br data-filtered=
"filtered"
> os.Exit(
0
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> length, err := con.Read(msg)<br data-filtered=
"filtered"
>
if
err != nil {<br data-filtered=
"filtered"
> fmt.Printf(
"Error when read from server.\n"
)<br data-filtered=
"filtered"
> os.Exit(
0
)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
> str = string(msg[
0
:length])<br data-filtered=
"filtered"
> fmt.Println(str)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
></span>
|
Go的并发模式
1
|
<span style=
"font-size:16px;"
>
package
main<br data-filtered=
"filtered"
>
import
(<br data-filtered=
"filtered"
>
"fmt"
<br data-filtered=
"filtered"
>
"runtime"
<br data-filtered=
"filtered"
>)<br data-filtered=
"filtered"
>func say(s string) {<br data-filtered=
"filtered"
>
for
i :=
0
; i <
5
; i++ {<br data-filtered=
"filtered"
> runtime.Gosched()<br data-filtered=
"filtered"
> fmt.Println(s)<br data-filtered=
"filtered"
> }<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
>func main() {<br data-filtered=
"filtered"
> go say(
"world"
)<br data-filtered=
"filtered"
> say(
"end"
)<br data-filtered=
"filtered"
>}<br data-filtered=
"filtered"
></span>
|
结果:
本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1286372,如需转载请自行联系原作者