使用Unity在C#中发送http请求
如何使用Unity在C#中发送HTTP GET和POST请求?
我想要的是:
- 在post请求中发送json数据(我使用Unity序列化器,因此不需要新的,我只想在post数据中传递字符串并且能够将ContentType设置为application / json);
- 获得响应代码和正文没有任何问题;
- 在不阻止ui渲染的情况下完成异步操作。
我尝试过的:
- 使用HttpWebRequest / HttpWebResponse实现,但它太难和低级别(如果我找不到更好的东西,我将不得不使用它);
- 使用统一WWW,但它不符合我的要求;
- 使用NuGet的一些外部包 – Unity不接受它们:(
大多数问题都是使用线程,我在C#中没有足够的经验。 我使用的文本编辑器是Intellij Rider。
WWW
API应该完成这个,但是UnityWebRequest
取代了它,所以我将回答更新的API。 这很简单。 您必须使用协同程序使用Unity的API执行此操作,否则您必须使用C#标准Web请求API和线程之一。 使用协程,您可以在完成之前提出请求。 这不会阻止主线程或阻止其他脚本运行。
注意 :
对于下面的示例,如果您使用的是Unity 2017.2以下的任何内容,请使用Send()
替换isNetworkError
Send()
,然后将isNetworkError
替换为isError
。 这将适用于较低版本的Unity。 此外,如果您需要以二进制forms访问下载的数据,请将uwr.downloadHandler.text
替换为uwr.downloadHandler.data
。 最后, SetRequestHeader
函数用于设置请求的标头。
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); } }
使用Multipart FormData / Multipart表单文件的POST请求 :
void Start() { StartCoroutine(postRequest("http:///www.yoururl.com")); } IEnumerator PostRequest(string url) { List formData = new List (); 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"); } }
使用HttpClient和类似的东西:
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; }
Payload是一个要序列化为json的对象。 如果所有请求都转到同一个baseUrl,您可以全局设置HttpClient,并在此处重用它