使用golang怎么实现一个短url项目

  介绍

本篇文章为大家展示了使用golang怎么实现一个短url项目,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1。把一个长url转换为一个短url网址
2。主要用于微博,二维码,等有字数限制的场景

主要实现的功能分析:
1。把长url的地址转换为短url地址
2。通过短url获取对应的原始长url地址
3。相同长url地址是否需要同样的短url地址

这里实现的是一个api服务

使用golang怎么实现一个短url项目

<强>数据库设计

数据库的设计其实也没有非常复杂,如图所示:

使用golang怎么实现一个短url项目

这里有个设置需要主要就是关于数据库表中标识的设计,需要设置为自增的

并且这里有个问题需要提前知道,我们的思路是根据id的值会转换为62进制关于进制转换的代码为:

//,将十进制转换为62进制,,0-9a-zA-Z 六十二进制   {func  transTo62 (id  int64)字符串//,,,1,,,在1//才能,10,,在一个//才能,61年,在Z   charset 才能;:=,“0123456789 abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"   var 才能;shortUrl []字节   为{才能   ,,,var  result 字节   ,,,number :=id  %, 62   ,,,result =,字符集(数量)   ,,,var  tmp []字节   ,,,tmp =,附加(tmp,结果)   ,,,shortUrl =,附加(tmp, shortUrl……)   ,,,id =id /, 62   ,,,if  id ==, 0 {   ,,,,,休息   ,,,}   ,,}   fmt.Println才能(string (shortUrl))   return 才能;字符串(shortUrl)   }

所以这里需要设置一下数据库id的起始值,可以设置的大一点,这样转换为62进制之后不至于太短

<强>代码逻辑

项目完整的代码git地址:https://github.com/pythonsite/go_simple_code/tree/master/short_url
当然这里的代码还有待后面继续做优化,但是这里通过golang内置的net/http库实现了一个简单的api功能

代码的目录结构

| ____logic   |,| ____logic.go   | ____model   |,| ____data.go   | ____api   |,| ____api.go   | ____client   |,| ____client。去

逻辑目录为主要的处理逻辑
模型是定义了请求和响应结构体
api目录为程序的入口程序
客户端为测试请求,进行地址的转换

模型代码为:

package 模型         type  Long2ShortRequest  struct  {   OriginUrl 才能;string “json:“origin_url"”   }      type  ResponseHeader  struct  {   Code 才能;int “json:“code"”   Message 才能;string “json:“message"”   }      type  Long2ShortResponse  struct  {   ResponseHeader才能   ShortUrl 才能;string “json:“short_url"”   }      type  Short2LongRequest  struct  {   ShortUrl 才能;string “json:“short_url"”   }      type  Short2LongResponse  struct  {   ResponseHeader才能   OriginUrl 才能;string “json:“origin_url"”   }

逻辑的代码为:

package 逻辑      导入(   “才能go_dev/11/short_url/model"   “;github.com/jmoiron/sqlx"才能;   “才能fmt"   “才能加密/md5"   “才能数据库/sql"   )      var  (   Db  * sqlx.DB才能   )      type  ShortUrl  struct  {   Id 才能;int64 “db:“id"”   ShortUrl 才能;string “db:“short_url"”   OriginUrl 才能;string “db:“origin_url"”   HashCode 才能;string “db:“hash_code"”   }      func  InitDb (dsn 字符串)(err 错误),{//才能,数据库初始化   Db,才能,err =, sqlx.Open (“mysql" dsn)   if 才能;err  !=, nil {   ,,,fmt.Println (“connect 用mysql 失败:“,犯错)   ,才能返回   ,,}   ,返回   }      func  Long2Short (req  * model.Long2ShortRequest), (response  * model.Long2ShortResponse, err 错误),{   response 才能=,,model.Long2ShortResponse {}   urlMd5 才能;:=,fmt.Sprintf (“% x", md5.Sum([]字节(req.OriginUrl)))   var 才能;short  ShortUrl   err 才能=,Db.Get(和短,“select  id, short_url, origin_url, hash_code 得到short_url  where  hash_code=?“, urlMd5)   if 才能;err ==, sql.ErrNoRows {   ,,,err =nil   ,,,//,数据库中没有记录,重新生成一个新的短网址   ,,,shortUrl errRet :=, generateShortUrl(点播,urlMd5)   ,,,if  errRet  !=, nil {   ,,,,,err =errRet   ,,,,,回来   ,,,}   ,,,response.ShortUrl =shortUrl   ,才能返回   ,,}   if 才能;err  !=, nil {   ,才能返回   ,,}   response.ShortUrl 才能=short.ShortUrl   ,返回   }      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用golang怎么实现一个短url项目