Skip to content

VBMAN.ToolsHttp - HTTP 工具对象

概述

VBMAN.ToolsHttp 提供了 HTTP 相关的工具函数,包括 URL 编解码、查询字符串处理、内容解析等,是构建 HTTP 客户端和服务器的基础工具。

核心特性

  • URL 编解码: 支持 UTF-8 和 GB2312 编码
  • 查询字符串处理: 构建和解析 URL 参数
  • 内容解析: 解析 HTTP 请求内容和 Header
  • 格式转换: 集合对象与 Form 格式互转

方法

UrlEncodeUtf8

UTF-8 URL 编码

vb
Public Function UrlEncodeUtf8(ByVal szInput As Variant) As String

说明: 按照 RFC3986 标准编码,中文字符转为 UTF-8 后编码

示例:

vb
' 中文编码
Dim encoded As String
encoded = VBMAN.ToolsHttp.UrlEncodeUtf8("测试")
' 结果: %E6%B5%8B%E8%AF%95

' 带特殊字符
encoded = VBMAN.ToolsHttp.UrlEncodeUtf8("Hello 世界!")
' 结果: Hello%20%E4%B8%96%E7%95%8C%21

' 完整 URL 构建
Dim url As String
url = "https://api.example.com/search?q=" & VBMAN.ToolsHttp.UrlEncodeUtf8(TextSearch.Text)

UrlDecodeUtf8

UTF-8 URL 解码

vb
Public Function UrlDecodeUtf8(ByVal url As String) As String

示例:

vb
' 解码
Dim decoded As String
decoded = VBMAN.ToolsHttp.UrlDecodeUtf8("%E6%B5%8B%E8%AF%95")
' 结果: 测试

' 处理完整 URL
Dim fullUrl As String
fullUrl = "POST /api/%E6%B5%8B%E8%AF%95%20%E7%9A%84/c?d=123"
decoded = VBMAN.ToolsHttp.UrlDecodeUtf8(fullUrl)
' 结果: POST /api/测试 的/c?d=123

UrlEncode / UrlDecode

GB2312 URL 编解码

vb
Public Function UrlEncode(ByRef strURL As String) As String
Public Function UrlDecode(ByVal url As String) As String

示例:

vb
' GB2312 编码(用于旧系统兼容)
Dim encoded As String
encoded = VBMAN.ToolsHttp.UrlEncode("测试")
' 结果: %B2%E2%CA%D4

AddToQueryString

向 URL 添加查询参数

vb
Public Function AddToQueryString(ByVal url As String, ByVal QS As String) As String

示例:

vb
' 添加参数到已有查询字符串的 URL
Dim url1 As String
url1 = VBMAN.ToolsHttp.AddToQueryString("http://api.com/search?q=test", "page=2")
' 结果: http://api.com/search?q=test&page=2

' 添加到无参数的 URL
Dim url2 As String
url2 = VBMAN.ToolsHttp.AddToQueryString("http://api.com/users", "id=123")
' 结果: http://api.com/users?id=123

' 链式添加
Dim url3 As String
url3 = "http://api.com/search"
url3 = VBMAN.ToolsHttp.AddToQueryString(url3, "q=" & VBMAN.ToolsHttp.UrlEncodeUtf8("搜索"))
url3 = VBMAN.ToolsHttp.AddToQueryString(url3, "page=1")
url3 = VBMAN.ToolsHttp.AddToQueryString(url3, "size=20")

MakeContent

将字典转换为查询字符串

vb
Public Function MakeContent(Dic As Scripting.Dictionary, Optional IsUrlEncode As Boolean = True) As String

参数:

  • Dic - 参数字典
  • IsUrlEncode - 是否对值进行 URL 编码(默认 True)

示例:

vb
' 构建 POST 数据
Dim params As New Scripting.Dictionary
params("username") = "admin"
params("password") = "123456"
params("remember") = "true"

Dim postData As String
postData = VBMAN.ToolsHttp.MakeContent(params)
' 结果: username=admin&password=123456&remember=true

' 不编码版本
Dim postDataRaw As String
postDataRaw = VBMAN.ToolsHttp.MakeContent(params, False)

ParseContent

解析查询字符串到字典

vb
Public Function ParseContent(Content As String, Obj As Scripting.Dictionary, Optional IsUrlDecode As Boolean = True) As Boolean

示例:

vb
' 解析 URL 参数
Dim queryString As String
queryString = "name=%E5%BC%A0%E4%B8%89&age=25&city=%E5%8C%97%E4%BA%AC"

Dim params As New Scripting.Dictionary
VBMAN.ToolsHttp.ParseContent queryString, params

Debug.Print params("name")   ' 张三
Debug.Print params("age")    ' 25
Debug.Print params("city")   ' 北京

' 解析 POST 数据
Dim postData As String
postData = "username=admin&password=secret&action=login"

Dim formData As New Scripting.Dictionary
VBMAN.ToolsHttp.ParseContent postData, formData, False

ParseKeyValue

解析 Key:Value 格式内容(如 HTTP Header)

vb
Public Function ParseKeyValue(Content As String, Obj As Scripting.Dictionary) As Boolean

示例:

vb
' 解析 HTTP Header
Dim headers As String
headers = "Content-Type: application/json" & vbCrLf & _
          "Authorization: Bearer token123" & vbCrLf & _
          "Accept: */*"

Dim headerDic As New Scripting.Dictionary
VBMAN.ToolsHttp.ParseKeyValue headers, headerDic

Debug.Print headerDic("Content-Type")      ' application/json
Debug.Print headerDic("Authorization")     ' Bearer token123

MapMethod / MapMethodName

HTTP 方法名称与索引互转

vb
Public Function MapMethod(Name As String) As Long
Public Function MapMethodName(Index As Long) As String

示例:

vb
' 方法名转索引
Dim methodIndex As Long
methodIndex = VBMAN.ToolsHttp.MapMethod("POST")   ' 结果: 1
methodIndex = VBMAN.ToolsHttp.MapMethod("GET")    ' 结果: 2

' 索引转方法名
Dim methodName As String
methodName = VBMAN.ToolsHttp.MapMethodName(1)     ' 结果: POST
methodName = VBMAN.ToolsHttp.MapMethodName(2)     ' 结果: GET

' 支持的映射
' 0: ANY, 1: POST, 2: GET, 3: PUT, 4: DELETE, 5: OPTIONS

ToWwwFormUrlencoded

将集合对象转换为 Form URL-Encoded 格式

vb
Public Function ToWwwFormUrlencoded(ByRef Obj As Object, Optional ByVal IsUrlEncode As Boolean = True) As String

示例:

vb
' 使用 cCollection
Dim coll As New cCollection
coll("name") = "张三"
coll("age") = "25"

Dim formData As String
formData = VBMAN.ToolsHttp.ToWwwFormUrlencoded(coll)
' 结果: name=%E5%BC%A0%E4%B8%89&age=25

' 使用 Dictionary
Dim dic As New Scripting.Dictionary
dic("key1") = "value1"
dic("key2") = "value2"

Dim encoded As String
encoded = VBMAN.ToolsHttp.ToWwwFormUrlencoded(dic, True)

FromWwwFormUrlencoded

解析 Form URL-Encoded 格式到集合对象

vb
Public Function FromWwwFormUrlencoded(ByVal Content As String, ByRef Obj As Object, Optional ByVal IsUrlDecode As Boolean = True) As Boolean

示例:

vb
' 解析到 cCollection
Dim coll As New cCollection
VBMAN.ToolsHttp.FromWwwFormUrlencoded "name=%E5%BC%A0%E4%B8%89&age=25", coll

Debug.Print coll("name")   ' 张三
Debug.Print coll("age")    ' 25

' 解析到 Dictionary
Dim dic As New Scripting.Dictionary
VBMAN.ToolsHttp.FromWwwFormUrlencoded "key1=value1&key2=value2", dic, False

综合示例

示例1: 构建带参数的 URL

vb
Private Function BuildSearchUrl(baseUrl As String, keyword As String, page As Integer, pageSize As Integer) As String
    Dim url As String
    url = baseUrl
    
    ' 添加查询参数
    url = VBMAN.ToolsHttp.AddToQueryString(url, "q=" & VBMAN.ToolsHttp.UrlEncodeUtf8(keyword))
    url = VBMAN.ToolsHttp.AddToQueryString(url, "page=" & page)
    url = VBMAN.ToolsHttp.AddToQueryString(url, "size=" & pageSize)
    
    BuildSearchUrl = url
End Function

Private Sub TestBuildUrl()
    Dim url As String
    url = BuildSearchUrl("https://api.example.com/search", "VB6 编程", 1, 20)
    Debug.Print url
    ' 结果: https://api.example.com/search?q=VB6%20%E7%BC%96%E7%A8%8B&page=1&size=20
End Sub

示例2: 处理 HTTP 请求

vb
Private Sub HandleHttpRequest(requestData As String)
    ' 解析请求行和 Header
    Dim lines() As String
    lines = Split(requestData, vbCrLf)
    
    ' 第一行是请求行
    Dim requestLine As String
    requestLine = lines(0)
    Debug.Print "请求: " & requestLine
    
    ' 解析 Header
    Dim headers As New Scripting.Dictionary
    Dim i As Integer
    For i = 1 To UBound(lines)
        If lines(i) = "" Then Exit For  ' Header 结束
        VBMAN.ToolsHttp.ParseKeyValue lines(i), headers
    Next i
    
    Debug.Print "Content-Type: " & headers("Content-Type")
End Sub

示例3: 表单数据处理

vb
Private Sub ProcessFormSubmit()
    ' 模拟表单数据
    Dim formData As String
    formData = "username=admin&password=secret&remember=true"
    
    ' 解析
    Dim params As New Scripting.Dictionary
    VBMAN.ToolsHttp.ParseContent formData, params, False
    
    ' 处理登录
    If Login(params("username"), params("password")) Then
        Debug.Print "登录成功"
    Else
        Debug.Print "登录失败"
    End If
End Sub

示例4: API 客户端请求构建

vb
Private Function BuildApiRequest(endpoint As String, method As String, params As Scripting.Dictionary) As String
    Dim request As String
    
    ' 构建请求行
    Dim methodIndex As Long
    methodIndex = VBMAN.ToolsHttp.MapMethod(UCase(method))
    
    If methodIndex = 2 Then  ' GET
        ' GET 请求参数放 URL
        Dim queryString As String
        queryString = VBMAN.ToolsHttp.MakeContent(params)
        request = "GET " & endpoint & "?" & queryString & " HTTP/1.1" & vbCrLf
    Else
        ' POST/PUT 等参数放 Body
        request = method & " " & endpoint & " HTTP/1.1" & vbCrLf
        request = request & "Content-Type: application/x-www-form-urlencoded" & vbCrLf
        request = request & vbCrLf
        request = request & VBMAN.ToolsHttp.MakeContent(params)
    End If
    
    BuildApiRequest = request
End Function

最佳实践

  1. 编码一致性: 确保服务器和客户端使用相同的编码(推荐 UTF-8)
  2. 参数校验: 编码前检查参数是否为空
  3. URL 长度: GET 请求 URL 长度有限制,大数据量使用 POST
  4. 特殊字符: 注意处理 &=? 等特殊字符
  5. 安全性: 敏感信息不要放在 URL 参数中

VB6及其LOGO版权为微软公司所有