首页 > 技术文章 > (一) go 实现的基于REST的Web服务

walkinginthesun 2018-08-26 21:43 原文

参考: 《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
}

推荐阅读