使用Unity在C#中发送HTTP请求

Sending http requests in C# with Unity

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

我想要的是:

  • 在发布请求中发送json数据(我使用Unity序列化器,因此无需
    新的,我只想在发布数据中传递字符串并有能力
    将ContentType设置为application / json);
  • 获得响应代码和正文,没有任何问题;
  • 异步完成所有操作,而不会阻止ui渲染。

我尝试过的

  • 使用HttpWebRequest / HttpWebResponse来实现,但是它太难了而且水平太低(如果我找不到更好的东西,那我就不得不使用它);
  • 使用统一的WWW,但不符合我的要求;
  • 使用NuGet的一些外部软件包-Unity不接受它们:(

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


WWW API应该可以完成此任务,但是UnityWebRequest可以替代它,因此我将回答较新的API。真的很简单。您必须使用协程通过Unity的API来执行此操作,否则必须使用C#标准Web请求API和Thread之一。使用协程,您可以发出请求直到完成。这不会阻止主线程,也不会阻止其他脚本运行。

注意:

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

GET请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 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);
     }
 }

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);
    }
}

放置请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
    }
}

删除请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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");
    }
}


使用HttpClient和类似的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static HttpContent DoPost(object payload, string subPath)
    {
        var httpClient = new HttpClient();

        HttpClient.BaseAddress = new Uri(Global.BaseUrl);
        HttpClient.DefaultRequestHeaders.Clear();
        HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // if you're using json service

        // make request
        var response = Global.HttpClient.PostAsJsonAsync(subPath.TrimLeadingSlash(), payload).Result;

        // check for error
        response.EnsureSuccessStatusCode();

        // return result
        return response.Content;
    }

有效负载是要序列化为json的对象。如果所有请求都发送到相同的baseUrl,则可以全局设置HttpClient,并在此处重用