Golang实现简易URL缩短服务
Golang实现简易URL缩短服务 大家好。我需要一些帮助来构建一个URL缩短器。我已经完成了大部分工作,现在只需要一个处理器来正确处理缩短后的链接(理解它们与正常链接的关联关系并进行托管)。除了网页使用的HTML和CSS外,其他所有部分我都使用GO语言实现。
3 回复
最后一部分难道不是对所有指向缩短URL的传入请求返回301永久移动状态,并指向正确的URL吗?
就像这样,但不同请求对应不同URL
package main
import (
"log"
"net/http"
)
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "http://www.google.com", 301)
以下是一个使用 Go 语言实现的简易 URL 缩短服务的处理器示例,它处理缩短后的链接重定向到原始 URL。假设您已经有一个存储映射(例如使用内存或数据库),这里使用内存映射作为演示。
示例代码
首先,定义一个简单的存储结构来保存短码与原始 URL 的映射。然后,使用 net/http 包创建一个 HTTP 处理器来处理缩短链接的重定向。
package main
import (
"fmt"
"net/http"
"sync"
)
// URLStore 用于存储短码和原始URL的映射
type URLStore struct {
urls map[string]string
mu sync.RWMutex
}
// NewURLStore 初始化URLStore
func NewURLStore() *URLStore {
return &URLStore{
urls: make(map[string]string),
}
}
// Set 方法存储短码和URL的映射
func (s *URLStore) Set(shortCode, url string) {
s.mu.Lock()
defer s.mu.Unlock()
s.urls[shortCode] = url
}
// Get 方法根据短码获取原始URL
func (s *URLStore) Get(shortCode string) (string, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
url, exists := s.urls[shortCode]
return url, exists
}
// 全局URL存储实例
var store = NewURLStore()
// redirectHandler 处理缩短链接的重定向
func redirectHandler(w http.ResponseWriter, r *http.Request) {
shortCode := r.URL.Path[1:] // 假设短码是路径的一部分,例如 "/abc123"
if shortCode == "" {
http.Error(w, "短码不能为空", http.StatusBadRequest)
return
}
// 从存储中获取原始URL
originalURL, exists := store.Get(shortCode)
if !exists {
http.Error(w, "短码未找到", http.StatusNotFound)
return
}
// 重定向到原始URL
http.Redirect(w, r, originalURL, http.StatusFound)
}
func main() {
// 示例:预先存储一些短码和URL(在实际应用中,通过API或表单添加)
store.Set("abc123", "https://example.com")
store.Set("test456", "https://golang.org")
// 设置HTTP路由,处理所有路径(短码)
http.HandleFunc("/", redirectHandler)
// 启动HTTP服务器在8080端口
fmt.Println("URL缩短服务运行在 http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
说明
- URLStore 结构:使用
map存储短码到原始 URL 的映射,并通过sync.RWMutex确保并发安全。 - redirectHandler 函数:作为 HTTP 处理器,从请求路径中提取短码(例如,访问
http://localhost:8080/abc123会提取短码 “abc123”),然后从存储中查找对应的原始 URL。如果找到,使用http.Redirect重定向;否则返回错误。 - main 函数:初始化存储并添加示例映射,然后启动 HTTP 服务器。
运行和测试
- 保存代码为
main.go并运行:go run main.go。 - 在浏览器中访问
http://localhost:8080/abc123,它将重定向到https://example.com。
在实际部署中,您可能需要添加 API 端点来动态生成短码(例如通过 POST 请求),并持久化存储到数据库(如 Redis 或 PostgreSQL)。此示例仅作为基础处理器,可根据需求扩展。

