• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Go]通道(channel)的基本操作发布时间:2022-07-10
下一篇:
[Go]使用Golang对鸢尾花数据集进行k-means聚类发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap