使用 UnityWebRequest 时报错 Curl error 1: Received HTTP/0.9 when not allowed [已解决]

省流版解决方案

将请求URL中的IP字段改为IPV6即可解决, 不要使用IPV4.

例如, 将请求URL改为http://[::1]:8089/static/1.txt

问题复现

目标

使用Go语言编写一个简单的静态资源服务器, 在assets目录下有一个1.txt文件. 我们希望利用Unity通过GET请求访问http://127.0.0.1:8089/static/1.txt并下载这个1.txt文件. 为了方便测试, 我们在游戏场景中放置了一个正方体, 如果Unity成功访问到这个文件, 正方体将会被销毁.

版本信息

Unity Editor Version 2021.3.6f1c1

Go Version go1.19.1 Windows/AMD64

Curl 7.83.1 (Windows) libcurl/7.83.1 Schannel

GO后端静态资源服务器的实现与测试

这是后端静态资源服务器的代码实现.

package main

import (
	"net/http"
)

// 解决跨域问题
func cors(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Add("Access-Control-Allow-Origin", "*")
		next.ServeHTTP(w, r)
	})
}

// 静态文件服务器
func main() {
	fs := http.FileServer(http.Dir("assets/"))
	http.Handle("/static/", cors(http.StripPrefix("/static/", fs)))
	http.ListenAndServe(":8089", nil)
}

使用浏览器访问这个URL, 可以直接读取1.txt的内容, 证明后端静态资源服务器已经成功实现.

Unity端对静态资源服务器进行访问

这是Unity端访问静态资源服务器的代码实现.

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class DynamicModelLoader : MonoBehaviour
{

    string URL = "http://127.0.0.1:8089/static/1.txt";

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(Down(URL));
    }

    IEnumerator Down(string downloadingUrl)
    {
        UnityWebRequest www = UnityWebRequest.Get(downloadingUrl);
        yield return www.SendWebRequest();
        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            // 以文本形式显示结果
            Debug.Log(www.downloadHandler.text);
            // 或者获取二进制数据形式的结果
            byte[] results = www.downloadHandler.data;
            // 为了可以在游戏界面中观察是否成功请求, 如果成功, 游戏内的正方体将会被销毁
            var go = GameObject.Find("Cube");
            Destroy(go);
        }
    }
}

然而, 在Editor中运行Unity却发生了如下的错误报告.

Curl error 1: Received HTTP/0.9 when not allowed 

在网上寻找了诸多的解决方案也未能解决这一问题.

更令人困惑的是, 如果我们将项目打包到WebGL, 用Live Server运行, 会惊奇地发现运行居然成功了, Unity确实访问到了这个URL, 如下图所示.

 

同时, 我们可以观察到游戏场景中的正方体消失了, 这与我们之前的假设相符, Unity确实成功完成了GET请求.

 之后经过了无比漫长的调试和资料搜索, 但是均不能解决. 最后抱着试试看的态度将URL中的IP字段由原来的127.0.0.1改为了[::1], 结果惊奇地发现在Editor中也能运行了, 如下图所示.

目前, 这虽然是一个解决方案, 但是本人才疏学浅, 尚未能分析出其报错的具体原因, 还请各位大佬能够帮助我找出原因, 不胜感激.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值