How to get JSON object by calling a url in Go Language?

huangapple go评论161阅读模式
英文:

How to get JSON object by calling a url in Go Language?

问题

我正在学习Golang,我想知道如何通过调用URL获取JSON响应,如果你能给我一个例子,那就太好了,这样我就可以自己进行指导。

英文:

I'm starting to learn Golang and I would like to know how to get a json response by calling an url, if you could give me an example it would be great in order to guide myself.

答案1

得分: 8

以下是翻译好的内容:

这是一个简单的示例,可以帮助你入门。你可以考虑创建一个结构体来保存你的请求结果,而不是使用map[string]interface{}。

package main

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

func main() {
   resp, err := http.Get("http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo")
   if err != nil {
      log.Fatal(err)
   }
   var generic map[string]interface{}
   err = json.NewDecoder(resp.Body).Decode(&generic)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(generic)
}
英文:

Here's a simple example to get you started. Instead of a map[string]interface{} you should consider making a struct to hold the result of your request.

package main

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

func main() {
   resp, err := http.Get("http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo")
   if err != nil {
      log.Fatal(err)
   }
   var generic map[string]interface{}
   err = json.NewDecoder(resp.Body).Decode(&generic)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(generic)
}

答案2

得分: 3

我会为您翻译以下内容:

我会写一个小的辅助函数来完成这个任务:

// getJSON 函数获取给定 URL 的内容
// 并将其解码为 JSON 存入给定的 result 变量中,
// result 应该是期望数据的指针。
func getJSON(url string, result interface{}) error {
	resp, err := http.Get(url)
	if err != nil {
		return fmt.Errorf("无法获取 URL %q 的内容:%v", url, err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("意外的 HTTP GET 状态:%s", resp.Status)
	}
	// 如果需要的话,我们可以在这里检查结果的内容类型。
	err := json.NewDecoder(resp.Body).Decode(result)
	if err != nil {
		return fmt.Errorf("无法解码 JSON:%v", err)
	}
	return nil
}

完整的工作示例可以在这里找到:http://play.golang.org/p/b1WJb7MbQV

请注意,检查状态码和 Get 错误同样重要,而且响应体必须显式关闭(请参阅这里的文档:http://golang.org/pkg/net/http/#Get)。

英文:

I'd write a little helper function to do it:

// getJSON fetches the contents of the given URL
// and decodes it as JSON into the given result,
// which should be a pointer to the expected data.
func getJSON(url string, result interface{}) error {
	resp, err := http.Get(url)
	if err != nil {
		return fmt.Errorf("cannot fetch URL %q: %v", url, err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("unexpected http GET status: %s", resp.Status)
	}
	// We could check the resulting content type
	// here if desired.
	err := json.NewDecoder(resp.Body).Decode(result)
	if err != nil {
		return fmt.Errorf("cannot decode JSON: %v", err)
	}
	return nil
}

A full working example can be found here: http://play.golang.org/p/b1WJb7MbQV

Note that it is important to check the status code as well as the Get error, and the response body must be closed explicitly (see the documentation here: http://golang.org/pkg/net/http/#Get)

huangapple
  • 本文由 发表于 2014年1月2日 05:48:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/20873640.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定