gpt4 book ai didi

c# - 使用 Unity 在 C# 中发送 http 请求

转载 作者:IT王子 更新时间:2023-10-29 04:25:50 25 4
gpt4 key购买 nike

如何使用 Unity 在 C# 中发送 HTTP GET 和 POST 请求?

我想要的是:

  • 在 post 请求中发送 json 数据(我使用 Unity 序列化程序,所以不需要新的,我只想在帖子数据中传递字符串并有能力将 ContentType 设置为 application/json);
  • 毫无问题地获取响应代码和正文;
  • 在不阻塞 ui 渲染的情况下全部异步完成。

我尝试过的:

  • 使用 HttpWebRequest/HttpWebResponse 实现,但它太难且级别太低(如果我找不到更好的东西,我将不得不使用它);
  • 使用unity WWW,但不符合我的要求;
  • 使用 NuGet 中的一些外部包 - Unity 不接受它们 :(

大多数问题都与线程有关,我在 C# 方面经验不足。我使用的 IDE 是 Intellij Rider。

最佳答案

WWW API 应该可以完成此操作,但 UnityWebRequest 替换了它,因此我将回答较新的 API。这真的很简单。您必须使用协程通过 Unity 的 API 执行此操作,否则您必须使用 C# 标准 Web 请求 API 和线程之一。使用协同程序,您可以在请求完成之前产生请求。这不会阻塞主线程或阻止其他脚本运行。

注意:

对于下面的示例,如果您使用的是 Unity 2017.2 以下的任何内容,请将 SendWebRequest() 替换为 Send() 并且然后将 isNetworkError 替换为 isError。这将适用于较低版本的 Unity。此外,如果您需要以二进制形式访问下载的数据,请将 uwr.downloadHandler.text 替换为 uwr.downloadHandler.data。最后使用SetRequestHeader函数设置请求的header。

GET 请求:

void Start()
{
StartCoroutine(getRequest("http:///www.yoururl.com"));
}

IEnumerator getRequest(string uri)
{
UnityWebRequest uwr = UnityWebRequest.Get(uri);
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}

带表单的 POST 请求:

void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com"));
}

IEnumerator postRequest(string url)
{
WWWForm form = new WWWForm();
form.AddField("myField", "myData");
form.AddField("Game Name", "Mario Kart");

UnityWebRequest uwr = UnityWebRequest.Post(url, form);
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}

使用 Json 的 POST 请求:

 void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com", "your json"));
}

IEnumerator postRequest(string url, string json)
{
var uwr = new UnityWebRequest(url, "POST");
byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
uwr.uploadHandler = (UploadHandler)new UploadHandlerRaw(jsonToSend);
uwr.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
uwr.SetRequestHeader("Content-Type", "application/json");

//Send the request then wait here until it returns
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}

带有多部分表单数据/多部分表单文件的 POST 请求:

void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com"));
}

IEnumerator postRequest(string url)
{
List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));

UnityWebRequest uwr = UnityWebRequest.Post(url, formData);
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}

PUT 请求:

void Start()
{
StartCoroutine(putRequest("http:///www.yoururl.com"));
}

IEnumerator putRequest(string url)
{
byte[] dataToPut = System.Text.Encoding.UTF8.GetBytes("Hello, This is a test");
UnityWebRequest uwr = UnityWebRequest.Put(url, dataToPut);
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}

删除请求:

void Start()
{
StartCoroutine(deleteRequest("http:///www.yoururl.com"));
}

IEnumerator deleteRequest(string url)
{
UnityWebRequest uwr = UnityWebRequest.Delete(url);
yield return uwr.SendWebRequest();

if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Deleted");
}
}

关于c# - 使用 Unity 在 C# 中发送 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com