Unity调用PHP接口拉取纹理报Curl error 3:url malformed错误如何解决
问题根因
你遇到的Curl error 3: malformed报错本质是传入UnityWebRequest的图片URL格式不符合规范,curl无法正常解析,具体问题点如下:
- PHP输出内容不符合预期:你当前PHP要么输出了带
<a>标签的HTML内容而非纯URL,要么仅输出test3.jpg的相对路径,没有完整的域名前缀,无法被识别为合法的HTTP URL - 协程执行顺序错误:
GetText和GetTexture都是异步协程,如果没有做顺序控制,GetTexture可能在GetText还没拿到接口返回的URL时就已经执行,此时eserurl为空或为默认值,导致URL非法 - 没有做内容清洗:接口返回的文本可能携带多余的换行、空格、不可见字符,直接传入会导致URL格式错误
- 所用UnityWebRequest API已过时:
isNetworkError属性在新版Unity中已被弃用,可能存在判断逻辑异常
修复方案
1. 修复PHP输出逻辑
修改PHP代码,仅输出纯文本的完整图片URL,不要输出任何HTML标签、多余空白字符:
<?php // 直接输出完整可访问的图片URL,不要添加其他任何内容 echo "https://akdenizsergi.com/yetki/uploads/test3.jpg"; ?>
如果你需要动态输出不同的图片,也需要确保最终输出的是带http/https前缀的完整URL。
2. 修复C#逻辑
- 调整协程执行顺序,确保拿到URL后再请求纹理
- 增加URL清洗和合法性校验
- 更新API判断逻辑适配新版Unity
修复后的代码示例:
// 先调用GetText,拿到URL后自动触发GetTexture IEnumerator GetText() { UnityWebRequest www = UnityWebRequest.Get("http://localhost/yetki/eserlistesi2.php"); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log("获取URL失败:" + www.error); } else { // 清洗URL:去除前后空白、换行、不可见字符 eserurl = www.downloadHandler.text.Trim(); // 校验URL合法性 if (eserurl.StartsWith("http")) { // 确认URL有效后再调用获取纹理的协程 StartCoroutine(GetTexture()); } else { Debug.Log("返回的URL格式非法:" + eserurl); } } } IEnumerator GetTexture() { UnityWebRequest www = UnityWebRequestTexture.GetTexture(eserurl); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.Log("获取纹理失败:" + www.error); } else { myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture; GetComponent<Renderer>().material = myMat; // 纹理赋值给材质 myMat.mainTexture = myTexture; // 输出纹理尺寸 print("Size is " + myTexture.width + " by " + myTexture.height); // 调整平面尺寸匹配纹理 myPlane.transform.localScale += new Vector3(myTexture.width, 0, myTexture.height); } }
验证步骤
修复后先打印eserurl的实际值,确认它是完整的、没有多余字符的图片链接,再访问该链接确认可以正常打开图片,即可解决报错。
内容的提问来源于stack exchange,提问作者Hakan Yaman
相关产品推荐
相关产品推荐

