Go语言中通过get请求获取api.open-meteo.com网站的天气数据
Go语言中通过get请求获取api.open-meteo.com网站的天气数据
继C++中使用cpp-httplib和nlohmann_json库实现http请求获取天气数据和Nodejs通过get请求获取api.open-meteo.com网站的天气数据、使用Java通过get请求获取api.open-meteo.com网站的天气数据、Python中通过get请求获取api.open-meteo.com网站的天气数据、C#中通过get请求获取api.open-meteo.com网站的天气数据,我们再使用Go语言实现对应功能。
以下是使用 Go 语言发送 HTTP GET 请求以获取 api.open-meteo.com 网站天气数据的示例代码:
示例代码
package mainimport ("encoding/json""fmt""io/ioutil""net/http"
)func getWeather() {// API URL 和查询参数baseURL := "http://api.open-meteo.com/v1/forecast"latitude := "37.8136"longitude := "144.9631"query := fmt.Sprintf("%s?latitude=%s&longitude=%s¤t_weather=true", baseURL, latitude, longitude)// 发送 GET 请求resp, err := http.Get(query)if err != nil {fmt.Println("Error occurred while making the request:", err)return}defer resp.Body.Close()// 检查响应状态码if resp.StatusCode != http.StatusOK {fmt.Printf("Failed to retrieve data. Status code: %d\n", resp.StatusCode)return}// 读取响应数据body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Error reading response body:", err)return}// 解析 JSON 数据var weatherData map[string]interface{}if err := json.Unmarshal(body, &weatherData); err != nil {fmt.Println("Error parsing JSON:", err)return}// 打印天气数据fmt.Println("Weather Data:")fmt.Println(weatherData)
}func main() {getWeather()
}
说明
-
HTTP GET 请求:
- 使用
http.Get发送 GET 请求。 - 查询参数(纬度、经度等)通过
fmt.Sprintf拼接到 URL 中。
- 使用
-
响应处理:
- 检查响应状态码是否为
200 OK。 - 使用
ioutil.ReadAll读取响应体。
- 检查响应状态码是否为
-
JSON 解析:
- 使用
encoding/json包解析 JSON 数据。 - 将 JSON 数据解析为
map[string]interface{},便于动态访问字段。
- 使用
-
错误处理:
- 捕获网络请求错误、响应读取错误和 JSON 解析错误。
运行代码
-
保存文件
将代码保存为get_weather_data.go。 -
运行程序
在终端中运行以下命令:go run get_weather_data.go
示例输出
Weather Data:
map[latitude:37.8136 longitude:144.9631 generationtime_ms:0.123 utc_offset_seconds:0 timezone:GMT current_weather:map[temperature:20.5 windspeed:5.2 winddirection:180]]
注意事项
-
JSON 数据访问:
- 如果需要访问具体字段,可以使用类型断言。例如:
currentWeather := weatherData["current_weather"].(map[string]interface{}) temperature := currentWeather["temperature"].(float64) fmt.Printf("Current temperature: %.2f°C\n", temperature)
- 如果需要访问具体字段,可以使用类型断言。例如:
-
依赖管理:
- Go 自带的
net/http和encoding/json包已经足够处理 HTTP 请求和 JSON 数据解析,无需额外依赖。
- Go 自带的
-
网络连接:
- 确保你的网络可以访问
http://api.open-meteo.com。
- 确保你的网络可以访问
-
扩展功能:
- 如果需要发送 POST 请求或添加自定义头部,可以使用
http.NewRequest和http.Client。
- 如果需要发送 POST 请求或添加自定义头部,可以使用
示例扩展
如果需要打印当前温度,可以修改代码如下:
currentWeather := weatherData["current_weather"].(map[string]interface{})
temperature := currentWeather["temperature"].(float64)
fmt.Printf("Current temperature: %.2f°C\n", temperature)
