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

 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值