使用PowerShell获取GoPro Hero5状态JSON文件时遭遇协议违规问题
这个问题我之前也碰到过,GoPro Hero5的Wi-Fi API服务器在HTTP协议的实现上并不完全符合标准,具体来说就是返回的响应头没有严格遵循CRLF(回车+换行)的换行规范,而PowerShell的Invoke-RestMethod底层依赖的.NET HttpWebRequest默认会严格校验协议合规性,所以才触发了这个协议违规错误。
下面给你几个可行的解决思路,按从简单到复杂的顺序来试:
方法一:关闭HTTP 1.1的Expect100Continue机制
很多嵌入式设备的Web服务器不支持HTTP 1.1的100-continue握手机制,这往往是导致响应头格式异常的原因。先执行以下命令调整.NET的全局设置,再发起请求:
# 关闭Expect100Continue,避免触发服务器的非标准响应 [System.Net.ServicePointManager]::Expect100Continue = $false # 再次尝试获取状态 Invoke-RestMethod -Uri "http://10.5.5.9/gp/gpControl/status"
方法二:改用Invoke-WebRequest并手动解析
如果方法一还是不行,可以试试用Invoke-WebRequest,它对非标准响应的容忍度更高。结合-UseBasicParsing参数跳过HTML解析(因为我们只需要JSON内容),然后手动转换JSON:
[System.Net.ServicePointManager]::Expect100Continue = $false # 获取原始响应 $response = Invoke-WebRequest -Uri "http://10.5.5.9/gp/gpControl/status" -UseBasicParsing # 转换为JSON对象 $statusData = $response.Content | ConvertFrom-Json # 查看结果 $statusData
方法三:直接使用.NET HttpWebRequest手动处理
如果前面的方法都失效,最稳妥的方式是直接调用底层的.NET HttpWebRequest来处理请求,这样可以更灵活地控制协议行为:
# 创建请求对象 $request = [System.Net.HttpWebRequest]::Create("http://10.5.5.9/gp/gpControl/status") # 关闭Expect100Continue,适配GoPro的服务器 $request.ServicePoint.Expect100Continue = $false try { # 获取响应 $response = $request.GetResponse() # 读取响应流中的内容 $streamReader = New-Object System.IO.StreamReader($response.GetResponseStream()) $jsonContent = $streamReader.ReadToEnd() # 转换为PowerShell对象 $statusData = $jsonContent | ConvertFrom-Json # 输出状态信息 $statusData } finally { # 确保释放资源,避免内存泄漏 if ($response) { $response.Close() } if ($streamReader) { $streamReader.Close() } }
补充说明:GoPro的Wi-Fi API系列(包括Hero4/5/6等)都存在类似的非标准HTTP实现,所以这些绕过严格协议校验的方法是社区里常用的解决方案。建议先从方法一开始尝试,大部分情况下都能解决问题。
内容的提问来源于stack exchange,提问作者hen-ling
相关产品推荐
相关产品推荐

