zoukankan      html  css  js  c++  java
  • (一) go 实现的基于REST的Web服务

    参考: 《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
    "))
    		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
    "))
    		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
    }
    
    
  • 相关阅读:
    贴一段微博上的小知识
    关于编译Qt以及驱动的一点总结吧
    一些服务器客户端的c例子
    android中DatePicker和TimePicker的使用
    Python标准库string模块《未完待续》
    Qt: SQL Programming
    和一个坑爹的项目组的经历
    linux一些杂项整理
    Qt中的QTableWidget
    Linux c学习进程基础学习
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/9539082.html
Copyright © 2011-2022 走看看