go语言的urlencode编码使用方式
来源:互联网 发布:java统计在线用户 编辑:程序博客网 时间:2024/05/29 03:12
1,首先我们可以查看godoc.com下的net/url
https://godoc.org/net/url
2,我们来看下演示代码
package mainimport ( "crypto/md5" "flag" "fmt" "net/url" "strings" "time")func main() { fmt.Println("./timetoken -t 3600 -key key -url url") var t int64 var key string var resUrl string flag.Int64Var(&t, "t", 0, "expire timestamp") flag.StringVar(&key, "key", "", "encrypt key") flag.StringVar(&resUrl, "url", "", "resource url") flag.Parse() if t == 0 || key == "" || resUrl == "" { return } expireTime := fmt.Sprintf("%x", time.Now().Unix()+t) resUri, pErr := url.Parse(resUrl) if pErr != nil { return } fmt.Println(resUri) path := resUri.EscapedPath() fmt.Println(path) rawStr := fmt.Sprintf("%s%s%s", key, path, expireTime) fmt.Println(rawStr) md5H := md5.New() md5H.Write([]byte(rawStr)) sign := fmt.Sprintf("%x", md5H.Sum(nil)) //sign := hex.EncodeToString(md5H.Sum(nil)) var newUrl string if strings.Contains(resUrl, "?") { newUrl = fmt.Sprintf("%s&sign=%s&t=%s", resUrl, sign, expireTime) } else { newUrl = fmt.Sprintf("%s?sign=%s&t=%s", resUrl, sign, expireTime) } fmt.Println(newUrl)}
3,接着上面的代码,我们来分析下urlencode
1,我们看到的一个方法就是func (Values) Encode这个方法,但是它需要对Values类型的变量提供编码服务。返回Values的方法有func (u *URL) Query() Values。这条走不通,因为我要对path进行编码
2,然后我看了func (Values) Encode方法的源码,发现里面编码用的func QueryEscape(s string) string这个方法,但是这个方法,还是不能满足对url的编码服务,因为对“/“没有做特殊处理
3,其实使用很简单,当你url.parse的时候已经编码,但是你要取path的时候,会转换回来,所以导致处理失败。
4,最终采用了url.EscapedPath()这个方法,它可以直接对path进行编码。
0 0
- go语言的urlencode编码使用方式
- Go语言使用组合的方式实现多继承
- 高效的Go语言编码技巧
- server.urlencode的反编码
- Go语言反射的使用
- go语言:flag的使用
- Go语言defer的使用
- go语言的使用感受
- URLEncode 编码
- 使用UrlEncode和UrlDecode解决编码问题
- Mysql的Go语言驱动--Go-MySQL-Driver的使用
- php的urlencode()URL编码函数浅析
- php的urlencode()URL编码函数浅析
- UrlEncode()关于空格的编码问题
- php的urlencode()URL编码函数浅析
- 使用HttpURLConnection通过post请求服务器时,URLEncode编码的必要性
- go语言中的反射的使用
- [转]使用Go语言一段时间的感受
- centos 下 安装 vnc 、vnc+xrdp,teamview 使用记录
- 问题记录
- 一个小动画
- DIY小钢炮
- Python 函数基础
- go语言的urlencode编码使用方式
- manifest.json参数详解
- eclipse jni报错:UnsatisfiedLinkError: no *** in java.library.path
- LLVM : Unknown CMake command "add_llvm_loadable_module".
- 用canvas实现小方块的音符跳动
- Linux 初学者 第一个快捷键
- WPF Step By Step 系列-Prism框架在项目中使用
- HDU 1597 find the nth digit (数学题)
- Uri、UriMatcher、ContentUris详解