全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在 Go 中正确发起 HTTP GET 请求并解析 JSON 响应

本文详解 go 语言中发起 http 请求、读取响应体并安全解析 json 的完整流程,涵盖错误处理、资源释放和结构化解析等关键实践。

在 Go 中,http.Get() 仅返回 *http.Response 结构体(包含状态码、Header 等元信息),并不会自动读取或解析响应体内容。你看到的 &{200 OK ...} 输出正是 resp 变量本身的指针打印结果,而非 JSON 数据——真正的 JSON 内容位于 resp.Body 这个 io.ReadCloser 流中,必须显式读取并解码。

以下是修正后的标准实践代码(已补充必要导入和完整示例):

package main

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

func getDuckDuckGo(keyword string) (map[string]interface{}, error) {
    // 1. 发起请求并检查错误
    resp, err := http.Get("https://api.duckduckgo.com/?q=" + keyword + "&format=json&no_html=1")
    if err != nil {
        return nil, fmt.Errorf("HTTP request failed: %w", err)
    }
    defer resp.Body.Close() // 2. 必须关闭响应体,防止连接泄漏

    // 3. 检查 HTTP 状态码
    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("API returned non-200 status: %d", resp.StatusCode)
    }

    // 4. 使用 json.Decoder 直接从 Body 解码(流式、内存友好)
    var result map[string]interface{}
    if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
        return nil, fmt.Errorf("JSON decode failed: %w", err)
    }

    return result, nil
}

func main() {
    data, err := getDuckDuckGo("food")
    if err != nil {
        panic(err)
    }

    // 示例:安全提取字段(注意类型断言)
    if definition, ok := data["AbstractText"].(string); ok && definition != "" {
        fmt.Println("Definition:", definition)
    } else {
        fmt.Println("No definition found.")
    }

    if results, ok := data["RelatedTopics"].([]interface{}); ok && len(results) > 0 {
        if first, ok := results[0].(map[string]interface{}); ok {
            if firstText, ok := first["Text"].(string); ok {
                fmt.Println("First related topic:", firstText)
            }
        }
    }
}

⚠️ 关键注意事项:

  • 永远检查 http.Get() 和 json.Decode() 的错误:忽略错误是 Go 程序崩溃或静默失败的主因;
  • 务必调用 resp.Body.Close():即使使用 defer,也应在 if err != nil 后立即 return,避免执行到 defer 前 panic;
  • 优先使用 json.Decoder 而非 json.Unmarshal(io.ReadAll(...)):前者支持流式解析,对大响应更省内存;
  • DuckDuckGo API 已弃用 HTTP(需改用 HTTPS),且建议添加 &no_html=1 避免 HTML 转义干扰;
  • 若需强类型保障,应定义结构体(如 type DuckDuckResponse struct { AbstractText stringjson:"AbstractText"}),而非泛型 map[string]interface{}。

掌握这一模式,即可稳健处理任意 RESTful JSON API,为构建爬虫、微服务客户端等打下坚实基础。


# word  # html  # js  # json  # go  # ai  # 爬虫  # 状态码  # duckduckgo  # restful  # String  # if  # 结构体  # 指针  # Struct  # Interface  # 泛型  # nil  # map  # http  # https  # 而非  # 流式  # 这一  # 应在  # 省内  # 结构化  # 体内  # 客户端  # 若需 


相关文章: 如何使用Golang table-driven基准测试_多组数据测量函数效率  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站主机选购指南:核心配置优化与品牌推荐方案  网站按钮制作软件,如何实现网页中按钮的自动点击?  家具网站制作软件,家具厂怎么跑业务?  如何在腾讯云服务器快速搭建个人网站?  如何自定义建站之星网站的导航菜单样式?  建站之星北京办公室:智能建站系统与小程序生成方案解析  中山网站推广排名,中山信息港登录入口?  制作网站的基本流程,设计网站的软件是什么?  已有域名能否直接搭建网站?  制作农业网站的软件,比较好的农业网站推荐一下?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  济南专业网站制作公司,济南信息工程学校怎么样?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  网站制作软件有哪些,制图软件有哪些?  开封网站制作公司,网络用语开封是什么意思?  建站168自助建站系统:快速模板定制与SEO优化指南  实惠建站价格推荐:2025年高性价比自助建站套餐解析  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  完全自定义免费建站平台:主题模板在线生成一站式服务  魔毅自助建站系统:模板定制与SEO优化一键生成指南  建站主机是否等同于虚拟主机?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  微信小程序 input输入框控件详解及实例(多种示例)  如何挑选优质建站一级代理提升网站排名?  三星网站视频制作教程下载,三星w23网页如何全屏?  建站之星ASP如何实现CMS高效搭建与安全管理?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站主机服务器选购指南:轻量应用与VPS配置解析  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何确保西部建站助手FTP传输的安全性?  如何选购建站域名与空间?自助平台全解析  如何选择香港主机高效搭建外贸独立站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何获取PHP WAP自助建站系统源码?  已有域名如何免费搭建网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在橙子建站中快速调整背景颜色?  ,网页ppt怎么弄成自己的ppt?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何自定义建站之星模板颜色并下载新样式?  ,有什么在线背英语单词效率比较高的网站?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  建站VPS选购需注意哪些关键参数?  建站之星安装后如何自定义网站颜色与字体?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。