Golang实现简易URL缩短服务

Golang实现简易URL缩短服务 大家好。我需要一些帮助来构建一个URL缩短器。我已经完成了大部分工作,现在只需要一个处理器来正确处理缩短后的链接(理解它们与正常链接的关联关系并进行托管)。除了网页使用的HTML和CSS外,其他所有部分我都使用GO语言实现。

3 回复

是的,兄弟,这听起来很有希望

更多关于Golang实现简易URL缩短服务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最后一部分难道不是对所有指向缩短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 服务器。

运行和测试

  1. 保存代码为 main.go 并运行:go run main.go
  2. 在浏览器中访问 http://localhost:8080/abc123,它将重定向到 https://example.com

在实际部署中,您可能需要添加 API 端点来动态生成短码(例如通过 POST 请求),并持久化存储到数据库(如 Redis 或 PostgreSQL)。此示例仅作为基础处理器,可根据需求扩展。

回到顶部