使用GoLang get无法获得正确的json响应

时间:2014-12-20 00:48:44

标签: json go

我是Go的新手,正在尝试编写一个简单的网络抓取工具。我正在使用duck duck go的api并尝试显示搜索结果。

https://duckduckgo.com/api

这是我的代码 - 包主要

import (
    "fmt"
    "net/http"
)


func main() {
    getDuckDuckGo("food")
}

func getDuckDuckGo(keyword string) <- chan string{
    resp, _ := http.Get("http://api.duckduckgo.com/?q=" + keyword + "&format=json&pretty=1")
    c := make(chan string)


    fmt.Println(resp)
    var respMap map[string]interface{}
    fmt.Println(respMap)


    fmt.Println(respMap)
    return c
}

我的resp println给了我这个 -

&{200 OK 200 HTTP/1.1 1 1 map[Connection:[keep-alive] Content-Type:[application/x-javascript] Date:[Sat, 20 Dec 2014 00:41:49 GMT] Cache-Control:[max-age=1] Expires:[Sat, 20 Dec 2014 00:41:50 GMT] Server:[nginx] X-Duckduckgo-Locale:[en_US]] 0xf840053c20 -1 [chunked] false map[] 0xf84007c000}

而不是任何json。

我是否正确地执行了GET请求?

1 个答案:

答案 0 :(得分:1)

至少,你应该做以下事情:

  1. 检查http.Get()
  2. 的错误
  3. 获取io.Reader获取HTTP正文数据
  4. resp.Body
  5. 使用json.Decoder解码json
  6. 你的getDuckDuckGo()应该是这样的:

    func getDuckDuckGoImproved(k string) (map[string]interface{}, error) {
        resp, err := http.Get("http://api.duckduckgo.com/?=" + k + "&format=json")
        if err != nil {
            return nil, err
        }
        defer resp.Body.Close()
    
        r := make(map[string]interface{})
        d := json.NewDecoder(resp.Body)
        if err := d.Decode(&r); err != nil {
            return nil, err
        }
        return r, nil
    }