1、首先创建一个服务器访问的package
我们使用github的服务器做测试,因为github可以直接返回标准的json数据结构,然后我们转化为自定义的struct类型,首先在go的包目录原文件下创建一个go文件:
然后我们编辑该文件,实现结构的定义和数据的解析,代码如下:
package Github
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"strings"
"time"
)
//21模板
const IssuesURL = "https://api.github.com/search/issues"
type IssuesSearchResult struct {
TotalCount int `json:"total_count"`
Items []*Issue
}
type Issue struct {
Number int
HTMLURL string `json:"html_url"`
Title string
State string
User *User
CreatedAt time.Time `json:"created_at"`
Body string
}
type User struct {
Login string
HTMLURL string `json:"html_url"`
}
func SearchIssues(terms []string) (*IssuesSearchResult, error) {
q := url.QueryEscape(strings.Join(terms, " "))
resp, err := http.Get(IssuesURL + "?q=" + q)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusOK {
resp.Body.Close()
return nil, fmt.Errorf("search query failed:%s", resp.Status)
}
var result IssuesSearchResult
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
resp.Body.Close()
return nil, err
}
resp.Body.Close()
return &result, nil
}
代码中定义一个函数 SearchIssues,做用为当外部调用该接口时,传入的参数为搜索的关键字,直接在指定网站github上搜所该关键字对应的所有问题列表,将结果返回给外部调用方;
2、我们在包含main的package中使用上述包
首先是引入我们新定义的包Github:
mport (
"Github"
"fmt"
"html/template"
"io"
"log"
"math"
"net/http"
"os"
)
接下来要定义一个模板, 为了可以更好的展示在浏览器中,使用的HTML的格式来定义要用来显示的模板,定义代码如下(全局变量):
//21模板
var issueList = template.Must(template.New("issuelist").Parse(`
<h1>{{.TotalCount}} issues</h1>
<table>
<tr style='text-align: left'>
<th>id</th>
<th>status</th>
<th>user</th>
<th>title</th>
</tr>
{{range .Items}}
<tr>
<td><a href='{{.HTMLURL}}'>{{.Number}}</td>
<td>{{.State}}</td>
<td><a href='{{.User.HTMLURL}}'>{{.User.Login}}</a></td>
<td><a herf='{{.HTMLURL}}'>{{.Title}}</a></td>
</tr>
{{end}}
</table>
`))
接下来是main函数中对Github包的使用与将结果套上我们定义的模板后输出到一个html的文件中:
unc main() {
var terms = []string{"go", "crash"}
result, err := Github.SearchIssues(terms)
if err != nil {
log.Fatal(err)
}
genPath := "/Users/xuanwenchao/Documents/vscode_code/issuesTest.html"
fd, err := os.OpenFile(genPath, os.O_RDWR|os.O_CREATE, 0777)
if err != nil {
log.Fatal(err)
}
if err := issueList.Execute(fd, result); err != nil {
log.Fatal(err)
}
defer fd.Close()
可见代码创建了一个html文件用来保存我们的输出内容,代码运行后在指定的目录下可以见到生成的文件:
该文件中就是我们套上模板后的JSON内容,双击该文件后我这里用的是Safari浏览器打开的:
可以看到接口返回的是我们传入的搜索关键字相当的一系列结果;