您的位置:首页 > 理论基础 > 计算机网络

一个完整的通过encoding/json信息传递格式,采用http.POST利用进行与服务器通信,并对返回结果进行解析处理的典型案例

2017-04-23 13:24 956 查看
package main

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

//需要编码的参数
parameter := map[string]string{"id": 123456}

//利用encoding/json包进行编码
jsonstr, err := json.Marshal(parameter)
if err != nil {
fmt.Println("json encode err", err)
}

//将json编码后的字节流初始化一个字节 buffer
body := bytes.NewBuffer([]byte(jsonstr))
//利用Http.POST进行与服务器交互
resp, err := http.Post("http://www.baidu.com", "application/json", body)
if err != nil {
fmt.Println(err)
return nil, err
}

defer resp.Body.Close()
//方法一:直接对resp响应消息的body进行解析操作
respbody := make(map[string]interface{})
//对返回的结果response进行json解码,可以利用map[string]interface{} 通用的格式存放解码后的值,或者使用具体的response的返回的信息,构建一个结构体,来存放解析后的返回值
err = json.NewDecoder(resp.Body).Decode(&respbody)
if err != nil {
fmt.Println(err)
return
}

//方法二: 对resp响应消息的body进行转换成字节流后进行处理:
resflow, err := ioutil.ReadAll(resp.Body)
bReader := bytes.NewReader(resflow)
respbody := make(map[string]interface{})
err = json.NewDecoder(bReader).Decode(&respbody)
//resflow, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(respbody)
//end

validresult := make(map[string]string)

for k, v := range respbody {
switch element := v.(type) {
case int:
validresult[k] = strconv.Itoa(element)
case float64:
validresult[k] = strconv.FormatFloat(element, 'G', 30, 32)
case string:
validresult[k] = element
case map[string]interface{}:
for key, value := range element {
switch element1 := value.(type) {
case int:
validresult[key] = strconv.Itoa(element1)
case float64:
validresult[key] = strconv.FormatFloat(element1, 'G', 30, 32)
case string:
validresult[key] = element1
case nil:
validresult[key] = ""
}
}
default:
err = errors.New("switch match error")
return
}
}
fmt.Println(validresult)
return validresult, nil


原文:

http://studygolang.com/topics/1741
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐