Golang进阶练习二:短链接服务

一个简单的短链接服务,其实本质上是一个中间件

这里写图片描述
在浏览器输入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)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值