介绍
HTTP协议中,客户端发起请求,服务器响应请求。Go语言标准库中,可以通过使用HTTP客户端函数发送HTTP请求,并解析HTTP响应。在本文中,我们将介绍在Go语言中,如何使用HTTP客户端函数发送GET请求,并解析响应。
发送GET请求
发送HTTP请求,需要使用Http的客户端函数。在Go语言中,我们可以使用标准库中的http
和net/http
包中提供的函数。其中,我们需要使用到的方法是http.Get
,该函数使用HTTP GET方法执行HTTP请求,并返回服务器响应的HTTP响应。
我们通过调用http.Get
方法,向目标地址发出GET请求,并获得响应的Response
对象,通过Response
对象获得服务器返回的响应数据。
package main
import (
"fmt"
"net/http"
)
func main() {
resp, err := http.Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}
在上面的代码中,我们使用http.Get
方法向地址https://jsonplaceholder.typicode.com/posts
发送了一条GET请求,并通过resp
变量接收了返回的Response
对象。我们通过defer
关键字,在函数退出时关闭了返回的响应数据。
为了方便地获得HTTP响应的内容,我们可以使用ioutil.ReadAll
方法将HTTP响应体中的数据读取并以字节切片的形式返回。整个代码如下:
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
resp, err := http.Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
此时,我们通过fmt.Println(string(body))
语句将获得的HTTP响应的内容打印出来。该部分代码将返回https://jsonplaceholder.typicode.com/posts
地址的JSON格式的博客数据。
解析HTTP响应
解析JSON
如果HTTP响应是JSON格式的响应,我们需要先解析响应中的JSON数据,然后再进行其他处理。
在Go语言中,我们可以使用encoding/json
包中的Unmarshal
方法根据JSON数据的格式,将JSON字符串解析到结构体中。例如下面的代码:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Post struct {
UserId int `json:"userId"`
Id int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
func main() {
resp, err := http.Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
var posts []Post
err = json.Unmarshal(body, &posts)
if err != nil {
fmt.Println(err)
return
}
for _, post := range posts {
fmt.Println(post)
}
}
上面的代码中,我们首先定义了一个Post
结构体,该结构体中包含了博客中的必要信息。我们使用json.Unmarshal
方法将HTTP响应中的JSON数据解析为一个[]Post
切片,并在for循环中将这些博客的信息打印出来。
解析XML
类似地,如果HTTP响应是XML格式的,我们同样需要先解析XML数据,然后再进行其他处理。
在Go语言中,我们可以使用encoding/xml
包中的Unmarshal
方法,将XML数据解析到结构体中。例如下面的代码:
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"net/http"
)
type Post struct {
UserId int `xml:"userId"`
Id int `xml:"id"`
Title string `xml:"title"`
Body string `xml:"body"`
}
type Posts struct {
XMLName xml.Name `xml:"posts"`
Posts []Post `xml:"post"`
}
func main() {
resp, err := http.Get("https://john.student.rit.edu/341/projects/03/data.xml")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
var posts Posts
err = xml.Unmarshal(body, &posts)
if err != nil {
fmt.Println(err)
return
}
for _, post := range posts.Posts {
fmt.Println(post)
}
}
上面的代码中,我们首先定义了Post
和Posts
两个结构体,其中Posts
结构体中包含了一个XMLName
属性,用于指示XML文档的根元素的名称,以及一个Posts
切片,用于存放XML文档中的博客数据。通过使用xml.Unmarshal
方法将HTTP响应中的XML数据解析为一个Posts
对象,并在for循环中将其打印出来。
总结
在Go语言中,我们可以使用标准库中的http
和net/http
包中提供的函数,如http.Get
,对HTTP请求进行操作,并通过使用encoding/json
和encoding/xml
包中的方法,对HTTP响应中的JSON和XML格式的数据进行解析。
无论HTTP响应数据的格式如何,我们都可以根据其格式,将其解析到Go语言中定义好的结构体和变量中,方便我们后续的操作。