(一) go 实现的基于REST的Web服务

时间:2021-09-22 13:25:34

参考: 《Go Web 编程》

1. go 实现的基于REST的Web服务

// webserver project server.go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    //"strconv"
)

type Post struct {
    Id      int    `json:"id"`
    Content string `jsong:"content"`
    Author  string
}

// 全局变量,用来保存post
var posts []Post

func (post *Post) create() (err error) {
    posts = append(posts, *post)
    return
}

func (post *Post) delete() (err error) {
    for pos, p := range posts {
        if p.Id == post.Id {
            posts[pos] = posts[len(posts)-1]
            posts = posts[:len(posts)-1]
            return
        }
    }
    return
}

func main() {
    fmt.Print("start the web server")

    server := http.Server{
        Addr: "127.0.0.1:8080",
    }

    http.HandleFunc("/CRUD/", handleRequest)
    server.ListenAndServe()
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    var err error
    switch r.Method {
    case "GET":
        err = handleGet(w, r)
    case "POST":
        err = handlePost(w, r)
    case "PUT":
        err = handlePut(w, r)
    case "DELETE":
        err = handleDelete(w, r)
    }

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

func handleGet(w http.ResponseWriter, r *http.Request) (err error) {
    // return posts value
    result, err := json.Marshal(posts)
    if err != nil {
        w.WriteHeader(201)
        return
    }
    w.Write([]byte(result))
    return
}

func handlePost(w http.ResponseWriter, r *http.Request) (err error) {
    // read post data
    len := r.ContentLength
    body := make([]byte, len)
    r.Body.Read(body)

    // parse body to post
    var post Post
    err = json.Unmarshal(body, &post)
    if err != nil {
        w.Write([]byte("parse json failed\n"))
        return
    }
    // save post value to database or somewhere.
    post.create()

    // return posts value
    result, err := json.Marshal(posts)
    if err != nil {
        w.WriteHeader(201)
        return
    }
    w.Write([]byte(result))

    w.WriteHeader(200)
    return
}

func handlePut(w http.ResponseWriter, r *http.Request) (err error) {
    w.Write([]byte("handlePut()"))
    return
}

func handleDelete(w http.ResponseWriter, r *http.Request) (err error) {
    // read post data
    len := r.ContentLength
    body := make([]byte, len)
    r.Body.Read(body)

    // parse body to post
    var post Post
    err = json.Unmarshal(body, &post)
    if err != nil {
        w.Write([]byte("parse json failed\n"))
        return
    }
    // save post value to database or somewhere.
    post.delete()

    // return posts value
    result, err := json.Marshal(posts)
    if err != nil {
        w.WriteHeader(201)
        return
    }
    w.Write([]byte(result))

    //  var result string
    //  result = strconv.Itoa(post.Id)
    //  w.Write([]byte(result))

    w.WriteHeader(200)
    return
}