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=123UrlEncode / 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%D4AddToQueryString
向 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, FalseParseKeyValue
解析 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 token123MapMethod / 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: OPTIONSToWwwFormUrlencoded
将集合对象转换为 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最佳实践
- 编码一致性: 确保服务器和客户端使用相同的编码(推荐 UTF-8)
- 参数校验: 编码前检查参数是否为空
- URL 长度: GET 请求 URL 长度有限制,大数据量使用 POST
- 特殊字符: 注意处理
&、=、?等特殊字符 - 安全性: 敏感信息不要放在 URL 参数中