一个简单的短链接服务,其实本质上是一个中间件
在浏览器输入127.0.0.1:8080/baidu
就会跳转到百度
涉及知识点
1. handler (重点)
2. mux
3. json 解析
推荐两个链接
https://www.jianshu.com/p/be3d9cdc680b
https://www.jianshu.com/p/16210100d43d
package main
import (
"net/http"
"fmt"
"encoding/json"
"flag"
)
func defaltMux()*http.ServeMux{
mux:=http.NewServeMux()
mux.HandleFunc("/",hello)
return mux
}
func hello(w http.ResponseWriter,r *http.Request){
fmt.Fprint(w,"hello")
}
type Json struct{
Path string `json:"path"`
To string `json:"to"`
}
func main(){
mux := defaltMux()
urlType:=flag.String("type","json","输入短链接类型")
flag.Parse()
str:= `[
{"path":"/baidu","to":"http://www.baidu.com"},
{"path":"/google","to":"http://www.google.com"}
]`
pathToUrls := map[string]string{
"/baidu":"http://www.baidu.com",
"/google":"http://www.google.com",
}
switch *urlType {
case "json":
jsonHandler:=JsonHandler(str,mux)
fmt.Println("url type is json")
http.ListenAndServe(":8899",jsonHandler)
case "map":
mapHandler:=MapHandler(pathToUrls,mux)
fmt.Println("url type is map")
http.ListenAndServe(":8899",mapHandler)
}
}
func MapHandler(pathToUrls map[string]string,fallback http.Handler) http.HandlerFunc{
return func(w http.ResponseWriter,r *http.Request){
path,ok:=pathToUrls[r.URL.Path]
if ok {
//302重定向
http.Redirect(w,r,path,http.StatusFound)
}else{
fallback.ServeHTTP(w,r)
}
}
}
func JsonHandler(jsonstring string,fallback http.Handler) http.HandlerFunc{
return func(w http.ResponseWriter, r *http.Request) {
var jsons []Json
//解析json
json.Unmarshal([]byte(jsonstring),&jsons)
for i:=0;i<len(jsons) ;i++ {
if r.URL.Path == jsons[i].Path{
http.Redirect(w,r,jsons[i].To,http.StatusFound)
}
}
fallback.ServeHTTP(w,r)
}
}