golang实战--实现短地址服务
2017-04-11 15:40
555 查看
golang写的简单的短地址服务,只做练手用,还有很多不完善的地方
TODO:
验证URL的有效性;
确认URL的协议(http、https)
数据库操作优化
现在的路由太简单了
下面贴上代码
TODO:
验证URL的有效性;
确认URL的协议(http、https)
数据库操作优化
现在的路由太简单了
下面贴上代码
package main import ( "database/sql" "fmt" "net/http" "io/ioutil" "encoding/json" _ "github.com/go-sql-driver/mysql" ) var elements = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" var db *sql.DB type returnData struct { ShortUrl string LongUrl string } //这里首字母一定要大写 //json数据与struct字段相匹配时,会查找与json中key相同的可导出字段(首字母大写) type postData struct { LongUrl string } func main() { Init() http.HandleFunc("/", simpleRoute) err := http.ListenAndServe(":9090", nil) if err != nil { panic(err) } } func Init() { db, _ = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/shortener") //defer db.Close() } //十进制转换成62进制 func base10ToBase62(n int64) string { var str string for n != 0 { str += string(elements[n % 62]) n /= 62 } for len(str) != 5 { str += "0" } return str } func buildResponse(p postData) returnData { stmtIns, err := db.Prepare("INSERT INTO urls VALUES (null, '', ?, 0)") if err != nil { panic(err.Error()) } defer stmtIns.Close() result, err := stmtIns.Exec(p.LongUrl) if err != nil { panic(err.Error()) } id, _ := result.LastInsertId() shorter := base10ToBase62(id) stmtUps, err := db.Prepare("UPDATE urls SET short_url=? WHERE id=?") if err != nil { panic(err.Error()) } defer stmtUps.Close() stmtUps.Exec(shorter, id) var returns returnData returns.LongUrl = p.LongUrl returns.ShortUrl = shorter return returns } func shortUri(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var p postData data, _ := ioutil.ReadAll(r.Body) json.Unmarshal(data, &p) returnData := buildResponse(p) returnData.ShortUrl = "http://" + r.Host + "/"+ returnData.ShortUrl jsonData, err := json.Marshal(returnData) if err != nil { fmt.Println("json error:", err) } w.Write([]byte(jsonData)) } func simpleRoute(w http.ResponseWriter, r *http.Request) { urlPath := r.URL.Path if len(urlPath) == 6 { redirectUrl(w, r) } else if urlPath == "/shortener" { shortUri(w, r) } else { w.WriteHeader(404) } } func redirectUrl(w http.ResponseWriter, r *http.Request) { urlPath := r.URL.Path rs := []rune(urlPath) urlPath = string(rs[1:]) stmtOut, err := db.Prepare("SELECT long_url FROM urls WHERE short_url=?") if err != nil { panic(err.Error()) } defer stmtOut.Close() var url string err = stmtOut.QueryRow(urlPath).Scan(&url) if err != nil { panic(err.Error()) } http.Redirect(w, r, "http://" + url, 301) }
相关文章推荐
- WCF+EF 实战系列三 WCF服务的实现与托管
- Windows Server 2008 R2&Cisco2960 配置Radius服务 实现802.1x认证 实战
- java实现短地址服务的方法(附代码)
- AAA【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
- 网管实战多VLAN环境下DHCP服务的实现
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- 【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- Winform Log4Net实战:实现每天一个文件记录服务程序的执行情况。
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页
- golang实现的私聊服务
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
- 实战实现apache服务内部URL地址跳转
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【六】——实现资源间的关联
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【六】——实现资源间的关联
- iOS项目开发实战——实现苹果本地消息通知推送服务
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)