Bootstrap

go net/http解析RESTFul消息Body

之前用go写了个web服务器,因为用的是RESTFul的URL方式收发消息,所以必然会涉及到解析消息body。

先贴代码。只贴需要的部分,其他的就不贴了,关于怎么用go创建restful复位,我的其他帖子里面有写。

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

//msgNode 222
type msgNode struct {
	ID string `json:"id"`
	Name string `json:"name"`
}

//MsgBody ddd
type MsgBody struct {
	Vms []msgNode `json:"node"`
}

//CreateVMProcess 
func CreateVMProcess(uuid string, r *http.Request) []byte {

	fmt.Println(CurrentTime(), "CreateVMProcess: uuid is", uuid)

	//解析body
	reqBody := new(MsgBody )
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Println(CurrentTime(), "CreateVMProcess: get body failed")
		return resultFAIL(20180005, "CreateVMProcess: parse req msg body failed.")
	}

	err = json.Unmarshal(body, &reqBody)
	if err != nil {
		fmt.Println(CurrentTime(), "CreateVMProcess: Unmarshal data failed")
		return resultFAIL(20180006, "CreateVMProcess: Unmarshal vmdate failed.")
	}

	fmt.Println(CurrentTime(), reqBody)
}

go语言有一点不好,函数名,参数名里面有下划线的时候,会有告警。吐槽一下。

go语言对应json的处理很简单,不需要去按个取参数值,我们只需要定义一个结构体,然后Unmarshal就可以了。这个函数会把json消息按照你给的结构体去解析,并且填写值,简单吧。

这里需要注意的是

type msgNode struct {
    ID string `json:"id"`
    Name string `json:"name"`
}

定义json结构体的时候,里面的参数首字母一定要大写,不要问我为什么,想知道就去研究encoding/json的源码。而且名字不要随便取,跟json消息里面的对应上,如:

{
    "node":[{
        "id":"",
        "name":"",
        "index":0,
        "user_name":""
    }]
}

像这样的json消息,你需要建两个结构体。

type msgNode struct {
    ID string `json:"id"`
    Name string `json:"name"`
    Index int `json:"index"`
    UserName string `json:"user_name"`
}

type msgBody struct {
	Node []msgNode `json:"node"`
}

你的消息参数,决定了你的结构体定义,对于有起名困难症的人来说,这是个好消息,不用那么纠结了。

不知道你们有观察到没,user_name,json消息参数有这个,按照规则我们参数名应该是User_name。

这就是我之前吐槽的,go的参数名不能有下划线,但是我们可以用UserName,这样也可以解析。

;