文章目錄
- 項目概述
- 代碼功能詳解
- 1. 導入必要的包
- 2. 主函數和路由設置
- 3. 請求信息捕獲
- 4. 請求參數和頭信息
- 5. 請求體處理
- 5.1 JSON 數據處理
- 5.2 表單數據處理
- 5.3 Multipart 表單數據處理
- 5.4 其他類型數據處理
- 6. 構造響應對象
- 7. 返回 JSON 響應
- 功能特點
- 使用場景
- 完整代碼
項目概述
這個 Gin HTTP 請求調試器是一個功能完整的工具,用于測試和調試前端接口調用。它能夠捕獲并記錄所有請求信息,并以清晰的結構化方式展示這些信息。這個工具特別適合 API 開發、Webhook 調試、第三方服務集成驗證等場景。
代碼功能詳解
1. 導入必要的包
import ("encoding/json""fmt""io""net/http""strings""time""github.com/gin-gonic/gin"
)
encoding/json
: 用于 JSON 數據的編碼和解碼fmt
: 用于格式化輸入輸出io
: 提供基本的 I/O 操作net/http
: 提供 HTTP 相關功能strings
: 提供字符串操作函數time
: 提供時間相關功能github.com/gin-gonic/gin
: Gin Web 框架,用于構建 HTTP 服務器
2. 主函數和路由設置
func main() {r := gin.Default()r.Any("/*path", func(c *gin.Context) {// 請求處理邏輯})// 啟動服務fmt.Println("HTTP Request Debugger is running on http://localhost:8080")r.Run(":8080")
}
gin.Default()
: 創建一個默認的 Gin 路由器r.Any("/*path", ...)
: 定義一個通用的路由處理器,可以處理所有 HTTP 方法r.Run(":8080")
: 啟動 HTTP 服務器,監聽 8080 端口
3. 請求信息捕獲
// 獲取請求基本信息
url := c.Request.URL.String()
method := c.Request.Method
protocol := c.Request.Proto
host := c.Request.Host
path := c.Param("path")
clientIP := c.ClientIP()
timestamp := time.Now().Format("2006-01-02 15:04:05.000")
requestID := fmt.Sprintf("%d", time.Now().UnixNano())
url
: 完整的請求 URLmethod
: HTTP 方法(GET, POST, PUT, DELETE 等)protocol
: HTTP 協議版本(如 HTTP/1.1)host
: 請求的主機名path
: 請求路徑clientIP
: 客戶端的 IP 地址timestamp
: 請求時間戳,精確到毫秒requestID
: 唯一的請求 ID,基于時間戳生成
4. 請求參數和頭信息
// 獲取請求參數
params := c.Request.URL.Query()
// 獲取請求頭
headers := make(map[string]string)
for k, v := range c.Request.Header {headers[k] = strings.Join(v, ", ")
}
params
: 獲取 URL 查詢參數headers
: 獲取所有請求頭信息,并轉換為字符串形式的鍵值對
5. 請求體處理
// 處理不同類型的請求體
contentType := c.Request.Header.Get("Content-Type")
var data interface{}
var rawBody []byte
contentType
: 獲取請求體的內容類型data
: 用于存儲解析后的請求數據rawBody
: 用于存儲原始請求體
5.1 JSON 數據處理
if strings.Contains(contentType, "application/json") {// 處理JSON數據bodyBytes, err := io.ReadAll(c.Request.Body)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "cannot read body"})return}rawBody = bodyBytesvar jsonData map[string]interface{}if err := json.Unmarshal(bodyBytes, &jsonData); err == nil