Go语言网络数据解析和模板的使用(VSCode for mac)

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浏览器打开的:
在这里插入图片描述
可以看到接口返回的是我们传入的搜索关键字相当的一系列结果;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuanwenchao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值