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。
注意:
对于以下示例,如果您使用的是Unity 2017.2以下的版本,请将
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,并在此处重用