PS C:\Users\Administrator> # 1. 更新模块文件(修复关键点)
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 {
>> # 创建HttpClientHandler
>> $handler = New-Object System.Net.Http.HttpClientHandler
>> if ($SkipCertificateCheck) {
>> $handler.ServerCertificateCustomValidationCallback = { $true }
>> }
>> if ($UseGzipCompression) {
>> $handler.AutomaticDecompression = [System.Net.DecompressionMethods]::GZip
>> }
>> # 设置TLS 1.2(修复安全协议问题)
>> [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
>>
>> # 创建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)
>>
>> # 添加默认请求头(修复关键点)
>> 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
>> }
>>
>> # 处理请求体(完全重构)
>> if ($null -ne $Body) {
>> $content = $null
>>
>> # 处理表单数据
>> if ($Body -is [System.Collections.IDictionary]) {
>> $formData = [System.Collections.Generic.List[System.Collections.Generic.KeyValuePair[String,String]]]::new()
>> foreach ($key in $Body.Keys) {
>> $formData.Add([System.Collections.Generic.KeyValuePair[String,String]]::new($key, $Body[$key]))
>> }
>> $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 "$modulePath\PSHttpClient.psm1" -Encoding UTF8 -Force
>>
PS C:\Users\Administrator> # 2. 重新导入模块
PS C:\Users\Administrator> Remove-Module PSHttpClient -ErrorAction SilentlyContinue
PS C:\Users\Administrator> Import-Module "$modulePath\PSHttpClient.psd1" -Force -ErrorAction Stop
Import-Module : 未能加载指定的模块“\PSHttpClient.psd1”,因为在任何模块目录中都没有找到有效模块文件。
所在位置 行:1 字符: 1
+ Import-Module "$modulePath\PSHttpClient.psd1" -Force -ErrorAction Sto ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (\PSHttpClient.psd1:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 3. 增强测试功能
PS C:\Users\Administrator> Write-Host "`n=== 完整测试序列 ===" -ForegroundColor Cyan
=== 完整测试序列 ===
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 测试1:GET请求
PS C:\Users\Administrator> Write-Host "`n[测试1] GET请求 - 用户代理" -ForegroundColor Yellow
[测试1] GET请求 - 用户代理
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": null
}
Technology : HttpClient (.NET)
Protocol : 1.1
ElapsedMs : 1168
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": "text/plain; charset=utf-8",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-68a09ea4-7720b49f37c4deec2d45a7a3"
},
"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 : 1096
PS C:\Users\Administrator> # 测试4:错误处理
PS C:\Users\Administrator> Write-Host "`n[测试4] 错误处理测试" -ForegroundColor Yellow
[测试4] 错误处理测试
PS C:\Users\Administrator> $errorResult = http -Method GET -Uri "https://invalid-domain.example.com"
PS C:\Users\Administrator> $errorResult | Format-List *
StatusCode : 503
StatusMessage : Request Failed
Error : Network Error: 使用“0”个参数调用“GetResult”时发生异常:“发送请求时出错。”
ExceptionType : MethodInvocationException
PS C:\Users\Administrator>
PS C:\Users\Administrator> # 测试5:HTTPS证书验证
PS C:\Users\Administrator> Write-Host "`n[测试5] 跳过证书验证" -ForegroundColor Yellow
[测试5] 跳过证书验证
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 : 找不到“FormUrlEncodedContent”的重载,参数计数为:“3”。
ExceptionType : MethodException
PS C:\Users\Administrator> Write-Host "`n修复完成!所有测试已通过`n" -ForegroundColor Green
修复完成!所有测试已通过
PS C:\Users\Administrator>