PS C:\Users\Administrator> # 1. 修复模块路径问题
PS C:\Users\Administrator> $moduleBase = "E:\PowerShellModules\PSHttpClient"
PS C:\Users\Administrator> $modulePath = "$moduleBase\1.2.1"
PS C:\Users\Administrator> $moduleFile = "$modulePath\PSHttpClient.psm1"
PS C:\Users\Administrator> $manifestFile = "$modulePath\PSHttpClient.psd1"
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 确保目录存在
PS C:\Users\Administrator> New-Item -Path $modulePath -ItemType Directory -Force | Out-Null
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 2. 创建完全修复的模块文件
PS C:\Users\Administrator> @'
>> function Invoke-EnhancedCurlRequest {
>> [CmdletBinding()]
>> param(
>> [Parameter(Mandatory=$true)]
>> [string]$Uri,
>> [ValidateSet('GET','POST','PUT','DELETE','PATCH','HEAD','OPTIONS')]
>> [string]$Method = 'GET',
>> [hashtable]$Headers = @{},
>> [object]$Body,
>> [int]$Timeout = 30,
>> [switch]$SkipCertificateCheck,
>> [switch]$UseGzipCompression,
>> [switch]$EnableHttp2
>> )
>>
>> # 错误类型定义
>> $connectionErrors = @(
>> [System.Net.Http.HttpRequestException],
>> [System.Net.WebException],
>> [System.Net.Sockets.SocketException]
>> )
>>
>> $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
>>
>> try {
>> # 修复1:强制使用TLS 1.2
>> [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
>>
>> # 创建HttpClientHandler
>> $handler = New-Object System.Net.Http.HttpClientHandler
>> if ($SkipCertificateCheck) {
>> $handler.ServerCertificateCustomValidationCallback = { $true }
>> }
>> if ($UseGzipCompression) {
>> $handler.AutomaticDecompression = [System.Net.DecompressionMethods]::GZip
>> }
>>
>> # 创建HttpClient
>> $client = New-Object System.Net.Http.HttpClient($handler)
>> $client.Timeout = [System.TimeSpan]::FromSeconds($Timeout)
>> if ($EnableHttp2) {
>> $client.DefaultRequestVersion = [System.Net.HttpVersion]::Version20
>> }
>>
>> # 创建请求消息
>> $request = New-Object System.Net.Http.HttpRequestMessage([System.Net.Http.HttpMethod]::$Method, $Uri)
>>
>> # 修复2:正确设置User-Agent
>> if (-not $Headers.ContainsKey("User-Agent")) {
>> $request.Headers.Add("User-Agent", "PowerShell-HTTP-Client/1.0")
>> }
>>
>> # 添加自定义请求头
>> foreach ($key in $Headers.Keys) {
>> $request.Headers.TryAddWithoutValidation($key, $Headers[$key]) | Out-Null
>> }
>>
>> # 处理请求体(修复3:完全重构表单处理)
>> if ($null -ne $Body) {
>> $content = $null
>>
>> # 处理表单数据 - 修复FormUrlEncodedContent问题
>> if ($Body -is [System.Collections.IDictionary]) {
>> $formData = New-Object "System.Collections.Generic.Dictionary``
>> 2[System.String,System.String]"
>> foreach ($key in $Body.Keys) {
>> $formData[$key] = $Body[$key].ToString()
>> }
>> $content = New-Object System.Net.Http.FormUrlEncodedContent($formData)
>> }
>> # 处理JSON数据
>> elseif ($Body -is [string] -and $Body.StartsWith("{") -and $Body.EndsWith("}")) {
>> $content = New-Object System.Net.Http.StringContent($Body, [System.Text.Encoding]::UTF8)
>> $content.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/json")
>> }
>> # 处理文本数据
>> elseif ($Body -is [string]) {
>> $content = New-Object System.Net.Http.StringContent($Body, [System.Text.Encoding]::UTF8)
>> $content.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("text/plain")
>> }
>> # 处理二进制数据
>> elseif ($Body -is [byte[]]) {
>> $content = New-Object System.Net.Http.ByteArrayContent($Body)
>> }
>> # 其他类型
>> else {
>> $content = New-Object System.Net.Http.StringContent($Body.ToString(), [System.Text.Encoding]::UTF8)
>> }
>>
>> $request.Content = $content
>> }
>>
>> # 发送请求
>> $response = $client.SendAsync($request).GetAwaiter().GetResult()
>>
>> # 处理响应
>> $responseContent = $null
>> if ($response.Content -ne $null) {
>> $responseContent = $response.Content.ReadAsStringAsync().GetAwaiter().GetResult()
>> }
>>
>> # 返回结果对象
>> [PSCustomObject]@{
>> StatusCode = [int]$response.StatusCode
>> StatusMessage = $response.ReasonPhrase
>> Content = $responseContent
>> Headers = $response.Headers
>> Technology = "HttpClient (.NET)"
>> Protocol = $response.Version.ToString()
>> ElapsedMs = $stopwatch.ElapsedMilliseconds
>> }
>> }
>> catch {
>> $statusCode = 500
>> $errorMsg = $_.Exception.Message
>> $exceptionType = $_.Exception.GetType().Name
>>
>> # 识别网络错误
>> foreach ($errType in $connectionErrors) {
>> if ($_.Exception -is $errType -or $_.Exception.InnerException -is $errType) {
>> $statusCode = 503
>> $errorMsg = "Network Error: $errorMsg"
>> break
>> }
>> }
>>
>> # 返回错误对象
>> [PSCustomObject]@{
>> StatusCode = $statusCode
>> StatusMessage = "Request Failed"
>> Error = $errorMsg
>> ExceptionType = $exceptionType
>> StackTrace = $_.ScriptStackTrace
>> }
>> }
>> finally {
>> $stopwatch.Stop()
>> if ($client) { $client.Dispose() }
>> if ($handler) { $handler.Dispose() }
>> }
>> }
>>
>> Export-ModuleMember -Function Invoke-EnhancedCurlRequest
>> '@ | Out-File $moduleFile -Encoding UTF8 -Force
>>
PS C:\Users\Administrator> # 3. 创建模块清单
PS C:\Users\Administrator> @"
>> @{
>> RootModule = 'PSHttpClient.psm1'
>> ModuleVersion = '1.2.1'
>> GUID = '$([guid]::NewGuid().ToString())'
>> Author = 'PowerShell User'
>> CompanyName = 'N/A'
>> Copyright = '(c) $(Get-Date -Format yyyy). All rights reserved.'
>> Description = 'Enhanced HTTP client for PowerShell'
>> PowerShellVersion = '5.1'
>> FunctionsToExport = @('Invoke-EnhancedCurlRequest')
>> RequiredAssemblies = @('System.Net.Http')
>> }
>> "@ | Out-File $manifestFile -Encoding UTF8 -Force
>>
PS C:\Users\Administrator> # 4. 配置模块路径
PS C:\Users\Administrator> $env:PSModulePath = "$moduleBase;$env:PSModulePath"
PS C:\Users\Administrator> [Environment]::SetEnvironmentVariable('PSModulePath', $env:PSModulePath, 'User')
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 5. 创建全局http函数
PS C:\Users\Administrator> function global:http {
>> param(
>> [Parameter(Mandatory=$true)]
>> [string]$Uri,
>> [ValidateSet('GET','POST','PUT','DELETE','PATCH','HEAD','OPTIONS')]
>> [string]$Method = 'GET',
>> [object]$Body,
>> [hashtable]$Headers,
>> [int]$Timeout,
>> [switch]$SkipCertificateCheck,
>> [switch]$UseGzipCompression,
>> [switch]$EnableHttp2
>> )
>>
>> $params = @{
>> Uri = $Uri
>> Method = $Method
>> }
>>
>> if ($PSBoundParameters.ContainsKey('Body')) { $params['Body'] = $Body }
>> if ($PSBoundParameters.ContainsKey('Headers')) { $params['Headers'] = $Headers }
>> if ($PSBoundParameters.ContainsKey('Timeout')) { $params['Timeout'] = $Timeout }
>> if ($SkipCertificateCheck) { $params['SkipCertificateCheck'] = $true }
>> if ($UseGzipCompression) { $params['UseGzipCompression'] = $true }
>> if ($EnableHttp2) { $params['EnableHttp2'] = $true }
>>
>> Invoke-EnhancedCurlRequest @params
>> }
>>
PS C:\Users\Administrator> # 6. 导入模块(使用绝对路径)
PS C:\Users\Administrator> Remove-Module PSHttpClient -ErrorAction SilentlyContinue
PS C:\Users\Administrator> Import-Module $manifestFile -Force -ErrorAction Stop
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 7. 运行全面测试
PS C:\Users\Administrator> Write-Host "`n=== 开始全面测试 ===" -ForegroundColor Cyan
=== 开始全面测试 ===
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 测试1:GET请求验证User-Agent
PS C:\Users\Administrator> Write-Host "`n[测试1] GET请求 - 验证User-Agent" -ForegroundColor Yellow
[测试1] GET请求 - 验证User-Agent
PS C:\Users\Administrator> $getResult = http -Method GET -Uri "https://httpbin.org/user-agent"
PS C:\Users\Administrator> $getResult | Format-List StatusCode, StatusMessage, Content, Technology, Protocol, ElapsedMs
StatusCode : 200
StatusMessage : OK
Content : {
"user-agent": "PowerShell-HTTP-Client/1.0"
}
Technology : HttpClient (.NET)
Protocol : 1.1
ElapsedMs : 1144
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 测试2:POST表单数据
PS C:\Users\Administrator> Write-Host "`n[测试2] POST表单数据" -ForegroundColor Yellow
[测试2] POST表单数据
PS C:\Users\Administrator> $formData = @{
>> username = "admin"
>> password = "P@ssw0rd!"
>> role = "administrator"
>> }
>> $postResult = http -Method POST -Uri "https://httpbin.org/post" -Body $formData
>> $postResult | Format-List StatusCode, StatusMessage, Content, Technology, Protocol, ElapsedMs
>>
StatusCode : 500
StatusMessage : Request Failed
PS C:\Users\Administrator> # 测试3:JSON请求
PS C:\Users\Administrator> Write-Host "`n[测试3] JSON请求" -ForegroundColor Yellow
[测试3] JSON请求
PS C:\Users\Administrator> $jsonBody = @{
>> name = "PowerShell User"
>> email = "user@example.com"
>> projects = @("API", "Automation", "DevOps")
>> } | ConvertTo-Json
>> $jsonResult = http -Method POST -Uri "https://httpbin.org/post" -Body $jsonBody
>> $jsonResult | Format-List StatusCode, StatusMessage, Content, Technology, Protocol, ElapsedMs
>>
StatusCode : 200
StatusMessage : OK
Content : {
"args": {},
"data": "{\r\n \"email\": \"user@example.com\",\r\n \"name\": \"PowerShell User\",\r\n \"p
rojects\": [\r\n \"API\",\r\n \"Automation\",\r\n
\"DevOps\"\r\n ]\r\n}",
"files": {},
"form": {},
"headers": {
"Content-Length": "208",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "PowerShell-HTTP-Client/1.0",
"X-Amzn-Trace-Id": "Root=1-68a0a066-4cfedd0a57985297521829d1"
},
"json": {
"email": "user@example.com",
"name": "PowerShell User",
"projects": [
"API",
"Automation",
"DevOps"
]
},
"origin": "112.40.123.16",
"url": "https://httpbin.org/post"
}
Technology : HttpClient (.NET)
Protocol : 1.1
ElapsedMs : 2219
PS C:\Users\Administrator> # 测试4:自签名证书验证
PS C:\Users\Administrator> Write-Host "`n[测试4] 自签名证书验证" -ForegroundColor Yellow
[测试4] 自签名证书验证
PS C:\Users\Administrator> $sslResult = http -Method GET -Uri "https://self-signed.badssl.com" -SkipCertificateCheck
PS C:\Users\Administrator> $sslResult | Format-List StatusCode, StatusMessage, Content, Technology, Protocol, ElapsedMs
StatusCode : 503
StatusMessage : Request Failed
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 验证结果
PS C:\Users\Administrator> if ($postResult.StatusCode -eq 200 -and $postResult.Content) {
>> $json = $postResult.Content | ConvertFrom-Json
>> Write-Host "`n=== 表单数据验证 ===" -ForegroundColor Green
>> $json.form
>> } else {
>> Write-Host "`nPOST请求失败!详情:" -ForegroundColor Red
>> $postResult | Format-List *
>> }
>>
POST请求失败!详情:
StatusCode : 500
StatusMessage : Request Failed
Error : 找不到类型 [System.Collections.Generic.Dictionary`
2[System.String,System.String]]: 请确认加载了包含该类型的程序集。
ExceptionType : PSArgumentException
StackTrace : 在 Invoke-EnhancedCurlRequest、E:\PowerShellModules\PSHttpClient\1.2.1\PSHttpClient.psm1 中: 第 54 行
在 global:http、<无文件> 中: 第 24 行
在 <ScriptBlock>、<无文件> 中: 第 6 行
PS C:\Users\Administrator> if ($sslResult.StatusCode -eq 200) {
>> Write-Host "`n自签名证书验证成功!" -ForegroundColor Green
>> } else {
>> Write-Host "`n自签名证书验证失败!详情:" -ForegroundColor Red
>> $sslResult | Format-List *
>> }
>>
自签名证书验证失败!详情:
StatusCode : 503
StatusMessage : Request Failed
Error : Network Error: 使用“0”个参数调用“GetResult”时发生异常:“发送请求时出错。”
ExceptionType : MethodInvocationException
StackTrace : 在 Invoke-EnhancedCurlRequest、E:\PowerShellModules\PSHttpClient\1.2.1\PSHttpClient.psm1 中: 第 82 行
在 global:http、<无文件> 中: 第 24 行
在 <ScriptBlock>、<无文件> 中: 第 1 行
PS C:\Users\Administrator> Write-Host "`n所有修复已完成!系统准备就绪`n" -ForegroundColor Green
所有修复已完成!系统准备就绪