从Python迁移到PowerShell后API请求返回空的问题求助
解决PowerShell POST请求数组参数与Python兼容问题
问题根源在于Python requests库与PowerShell Invoke-WebRequest处理数组类型表单参数的逻辑不同:
- Python发送请求时,会将数组参数展开为重复的键值对,比如
productsCN[]=PR1234&productsCN[]=PR3456&productsCC[]=PR1234&productsCC[]=PR3456 - PowerShell默认会把数组拼接成单个字符串传递,导致接口无法解析数组结构
解决方案1:手动构建标准表单字符串
直接生成符合application/x-www-form-urlencoded格式的请求体,完全匹配Python的请求结构:
$arrayProducts = @("PR1234", "PR73456") $params = @() # 遍历产品代码,生成每个参数的键值对(自动URL编码) foreach ($code in $arrayProducts) { $encodedCode = [System.Web.HttpUtility]::UrlEncode($code) $params += "productsCN[]=$encodedCode" $params += "productsCC[]=$encodedCode" } # 拼接成完整的表单字符串 $payloadStock = $params -join "&" # 发送请求 $response = Invoke-WebRequest -Uri $urlStock -Body $payloadStock -Method POST -WebSession $webSession -ContentType "application/x-www-form-urlencoded"
解决方案2:使用HttpClient处理表单数据
利用.NET的FormUrlEncodedContent自动处理数组展开,逻辑与Python requests完全一致:
$arrayProducts = @("PR1234", "PR73456") # 构建字典类型的表单数据 $formData = [System.Collections.Generic.Dictionary[string, object]]::new() $formData.Add("productsCN[]", $arrayProducts) $formData.Add("productsCC[]", $arrayProducts) # 创建自动处理数组的表单内容 $content = [System.Net.Http.FormUrlEncodedContent]::new($formData) # 复用现有WebSession的Cookie $handler = [System.Net.Http.HttpClientHandler]::new() $handler.CookieContainer = $webSession.Cookies $httpClient = [System.Net.Http.HttpClient]::new($handler) # 发送请求并获取响应 $response = $httpClient.PostAsync($urlStock, $content).Result $responseContent = $response.Content.ReadAsStringAsync().Result
两种方案都能生成与Python请求完全一致的请求体,接口将正确返回多个产品的信息。
内容的提问来源于stack exchange,提问作者Daniziz
相关产品推荐
相关产品推荐

