Unity中如何发送HTTP/2请求?UnityWebRequest报错求解决方案
Unity 发送HTTP/2请求实现方案及报错解决
报错根因
Curl error 1: Received HTTP/0.9 when not allowed 是UnityWebRequest底层依赖的libcurl在HTTP/2握手阶段未收到符合协议规范的响应,被误判为HTTP/0.9返回导致的,常见触发场景:
- Unity版本低于2021.3.20f1:内置libcurl版本过旧,未开启HTTP/2的ALPN协商支持,握手直接失败
- 目标服务端HTTP/2配置异常:未正确开启h2协商、TLS证书不匹配,返回非标准响应
- 协议版本参数配置错误:手动指定HTTP版本时传参错误,导致协商不匹配
实现方案
方案1:原生UnityWebRequest实现(无额外依赖,推荐)
前置要求:使用Unity 2021.3.20f1及以上LTS版本、2022.1+版本,低版本内置libcurl无完整HTTP/2支持
配置示例代码:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class Http2Test : MonoBehaviour { IEnumerator Start() { var request = UnityWebRequest.Get("https://你的HTTP2接口地址/api"); // 指定HTTP/2协议版本 request.version = HttpVersion.Version20; // 部分2021.x小版本无Version20枚举,可直接传字符串值: // request.version = "HTTP/2.0"; yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log($"请求成功,响应:{request.downloadHandler.text}"); } else { Debug.LogError($"请求失败:{request.error}"); } } }
如果配置后仍然报错,先在本地用命令行执行curl --http2 你的接口地址验证,如果curl同样请求失败,属于服务端HTTP/2配置问题,和Unity客户端无关。
方案2:第三方类库适配(兼容低版本Unity)
如果项目无法升级到满足要求的Unity版本,可使用成熟第三方类库实现,不依赖Unity内置的libcurl:
- Best HTTP/2:Unity生态成熟的商业网络库,自带独立HTTP/2实现,兼容Unity 2018起全平台版本,支持HTTP/2、gRPC等协议,导入后直接设置
HTTPManager.DefaultProtocol = SupportedProtocols.HTTP2即可发起请求 - 原生HttpClient封装:Unity 2021+版本切换到.NET 6运行时、IL2CPP编译后端后,可直接使用System.Net.Http下的HttpClient发起HTTP/2请求,配置
HttpClient.DefaultRequestVersion = HttpVersion.Version20即可,注意该方案不兼容WebGL平台,WebGL平台网络请求由浏览器接管。
排错注意事项
- 不要在非HTTPS的明文HTTP地址上尝试请求HTTP/2:绝大多数服务端默认关闭明文HTTP/2(h2c)支持,直接请求会握手失败
- WebGL平台无需手动指定HTTP版本:浏览器会自动和服务端协商最高支持的HTTP版本,手动指定版本反而可能导致请求异常
- 部分低版本抓包工具(如旧版Charles、Fiddler)不支持HTTP/2协议解析,会篡改握手响应触发报错,测试时可先关闭系统代理排查
内容的提问来源于stack exchange,提问作者Asmar Ali
相关产品推荐
相关产品推荐

