删除文章

确定要删除这篇文章吗?

取消
确定

go http get post json

     阅读(231)  2019-06-16 00:01:26

get和post请求使用比较频繁,这里只考虑json格式,做一下简单封装。

get请求

func HttpGetJson(url string, resp interface{}) error {
    result, err := http.Get(url)
    if err == nil {
        defer result.Body.Close()
        return json.NewDecoder(result.Body).Decode(resp)
    }
    return err
}

用法举例:

jsonLogin := GithubLoginResponse{}
if err := util.HttpGetJson("https://api.github.com/user?access_token="+token, &jsonLogin); err != nil {
    errmsg = fmt.Sprintf("%v", err)
    break
}

post请求

相对较复杂些

func HttpPostJson(url string, data map[string]interface{}, resp interface{}) error {
    b, err := json.Marshal(data)
    if err != nil {
        return err
    }
    reader := bytes.NewReader(b)
    request, err := http.NewRequest("POST", url, reader)
    if err != nil {
        return err
    }
    request.Header.Set("Accept", "application/json;charset=UTF-8")
    request.Header.Set("Content-Type", "application/json;charset=UTF-8")
    client := http.Client{}
    response, err := client.Do(request)
    if err != nil {
        return err
    }
    defer response.Body.Close()
    return json.NewDecoder(response.Body).Decode(resp)
}

用法举例:

payload := make(map[string]interface{})
payload["client_id"] = "531ad8e4517595748d97"
payload["client_secret"] = "bf123fc9fe25a30e3e33d7a07daf825b73e07dc6"
payload["code"] = code
payload["state"] = state
var jsonAccessToken AccessTokenResponse
if err := util.HttpPostJson("https://github.com/login/oauth/access_token", payload, &jsonAccessToken); err != nil {
    errmsg = fmt.Sprintf("%v", err)
    break
}

注意上面的resp interface{}是根据json应答结果定义的struct,可以只定义要使用的字段,如果不知道怎么定义可以参考:https://www.ningto.com/post/5cd83f0be65d054c17b37f90

文章评论

Keep it simple,stupid
文章数
300
总访问量
444272
今日访问
610
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部