Python爬虫+Go WebServer+Flutter App(GoLang篇)
1.前言
继第一篇Python篇,这是第二篇GoLang篇,通过Go设置web server
2.Go 开发设置
设置服务端监听,等待客户端请求;处理客户端请求,查询数据库,生成返回结果,发送给客户端.
2.1安装Go
从官网下载对应系统的安装包
安装完成,设置好环境变量
输入"go version",如果显示相应的go版本,则安装完成
zxl@zxl:~$ go version go version go1.12 linux/amd64
2.2设置GOPATH
新建好go的工作空间根目录,将该目录设置为GOPATH
以linux为例
export GOPATH=/home/zxl/workspace/my_github/go_test_server
2.3安装开发工具LiteIDE
通过下载链接选择最新版本,下载对应系统的安装包
打开LitelDE,选择菜单"工具"—>“编辑当前环境”,设置好GOROOT,GOPATH,PATH
GOROOT=/usr/local/go GOPATH=/home/zxl/workspace/my_github/go_test_server PATH=$GOROOT/bin:$PATH
也可以选择菜单"工具"—>"管理GOPATH/Modules"设置每个工作空间的GOPATH
3.接口功能开发
接口主要响应客户端数据请求
3.1设置端口开启服务
如下代码所示,设置了端口为"9090"的服务,点击菜单"编译"—>“BuildAndRun”,则可以启动服务
在浏览器输入"http://localhost:9090/test",网页则显示"Hello astaxie!"
package mainimport ( "fmt" "log" "net/http" "strings" http_handle "http_handle")func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "")) } fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的}func main() { http.HandleFunc("/test", sayhelloName) //设置访问的路由 err := http.ListenAndServe(":9090", nil) //设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) }}
3.2从数据库获取数据,响应客户端请求
3.2.1创建数据结构
package datatype QsbkHotPicItem struct { Id string AuthorNickName string AuthorGender string AuthorAge string AuthorImgUrl string Content string ThumbImgUrl string StatsVoteContent string StatsCommentContent string StatsCommentDetailUrl string Md5 string}type QsbkHotPicItemList struct { ItemList []QsbkHotPicItem}
3.2.2创建数据库操作
package base_dbimport ( "database/sql" "fmt" _ "github.com/Go-SQL-Driver/MySQL")func Query(sql_str string) (*sql.Rows, *sql.Stmt, *sql.DB) { fmt.Println("query::sql_str = ", sql_str) db, _ := sql.Open("mysql", "用户名:密码@tcp(zxltest.zicp.vip:42278)/数据库名") fmt.Println("query::open_db_err = ", open_db_err) stmt, prepare_err := db.Prepare(sql_str) fmt.Println("query::prepare_err = ", prepare_err) rows, query_err := stmt.Query() fmt.Println("query::query_err = ", query_err) return rows, stmt, db}
3.2.3响应客户端请求
以MySQL为例,导入数据库驱动
在命令行终端,输入go get -u github.com/go-sql-driver/mysql
匿名导入包_ "github.com/Go-SQL-Driver/MySQL"
导入数据解构"data"
导入数据库操作base_db "db"
其会自动下载驱动库,并放入到设置的GOPATH目录下
这样就可以完成代码开发,最后以json形式把数据返回给客户端
package http_handleimport ( "encoding/json" "fmt" "net/http" "strconv" "strings" _ "github.com/Go-SQL-Driver/MySQL" "data" base_db "db")func QsbkHotPicList(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) var last_id = -1 if len(r.Form["last_id"]) > 0 { last_id, _ = strconv.Atoi(r.Form["last_id"][0]) } page, _ := strconv.Atoi(r.Form["page"][0]) page_size, _ := strconv.Atoi(r.Form["page_size"][0]) fmt.Println("last_id", last_id) fmt.Println("page", page) fmt.Println("page_size", page_size) var start_index = page * page_size var end_index = page_size fmt.Println("start_index", start_index) fmt.Println("end_index", end_index) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "")) } var sql_where = "" if last_id > 0 { start_index = 0 end_index = 10 sql_where = " WHERE id < " + strconv.Itoa(last_id) + " " } fmt.Println("sql_where", sql_where) var sql_str = "SELECT " + "id, author_nick_name,author_gender,author_age,author_img_url,content,thumb_img_url,stats_vote_content,stats_comment_content,stats_comment_detail_url,md5 " + "FROM joke " + sql_where + "ORDER BY id DESC LIMIT " + strconv.Itoa(start_index) + "," + strconv.Itoa(end_index) rows, stmt, db := base_db.Query(sql_str) var qsbkHotPicItemList data.QsbkHotPicItemList for rows.Next() { var id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5 string rows.Scan(&id, &author_nick_name, &author_gender, &author_age, &author_img_url, &content, &thumb_img_url, &stats_vote_content, &stats_comment_content, &stats_comment_detail_url, &md5) fmt.Println("query::result = ", id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5) var item = data.QsbkHotPicItem{id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5} qsbkHotPicItemList.ItemList = append(qsbkHotPicItemList.ItemList, item) } defer rows.Close() defer stmt.Close() defer db.Close() responseResult, responseError := json.Marshal(qsbkHotPicItemList) fmt.Println("query::responseError = ", responseError) fmt.Println("query::responseResult = ", string(responseResult)) fmt.Fprint(w, string(responseResult))}
4.设置电脑外网可访问
由于我们当前调试都是本地局域网络,别人是访问不了我们的服务,因此我们需要提供外网功能,即内网穿透
可以通过花生壳教程完成内网穿透设置
最后将我们的端口为"9090"的服务启动,再开启花生壳内网穿透设置,就可以提供外网功能了

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
可控制的启动关闭跑马灯效果
前言 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee"/> Android中当文本显示不全时可以通过设置跑马灯方式轮播显示所以文字 但是我们有时希望在指定情况下才启用跑马灯轮播,这就需要重写TextView来实现 自定义跑马灯 publicclassMarqueeTextextendsAppCompatTextView{ privatestaticfinalStringTAG="MarqueeText"; publicMarqueeText(Contextcontext){ super(context); } publicMarqueeText(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); } publicMarqueeText(...
- 下一篇
Go sync.Pool 浅析
hi, 大家好,我是 haohongfan。 sync.Pool 应该是 Go 里面明星级别的数据结构,有很多优秀的文章都在介绍这个结构,本篇文章简单剖析下 sync.Pool。不过说实话 sync.Pool 并不是我们日常开发中使用频率很高的的并发原语。 尽管用的频率很低,但是不可否认的是 sync.Pool 确实是 Go 的杀手锏,合理使用 sync.Pool 会让我们的程序性能飙升。本篇文章会从使用方式,源码剖析,运用场景等方面,让你对 sync.Pool 有一个清晰的认知。 使用方式 sync.Pool 使用很简单,但是想用对却很麻烦,因为你有可能看到网上一堆错误的示例,各位同学在搜索 sync.Pool 的使用例子时,要特别注意。 sync.Pool 是一个内存池。通常内存池是用来防止内存泄露的(例如C/C++)。sync.Pool 这个内存池却不是干这个的,带 GC 功能的语言都存在垃圾回收 STW 问题,需要回收的内存块越多,STW 持续时间就越长。如果能让 new 出来的变量,一直不被回收,得到重复利用,是不是就减轻了 GC 的压力。 正确的使用示例(下面的demo选自...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作