如何使用Unity在C#中发送HTTP GET和POST请求?
我想要的是:
我尝试了什么:
大多数问题都是使用线程,我在C#中没有足够的经验。 我使用的文本编辑器是Intellij Rider。
答案 0 :(得分:54)
WWW
API应该完成此操作,但UnityWebRequest
已取代它,因此我将回答较新的API。这很简单。您必须使用协同程序使用Unity的API执行此操作,否则您必须使用C#标准Web请求API和线程之一。使用协程,您可以在完成之前提出请求。这不会阻止主线程或阻止其他脚本运行。
注意强>:
对于以下示例,如果您使用的是 Unity 2017.2 下的任何内容,请将SendWebRequest()
替换为Send()
,然后将isNetworkError
替换为{{ 1}}。这将适用于较低版本的Unity。此外,如果您需要以二进制形式访问下载的数据,请将isError
替换为uwr.downloadHandler.text
。最后,uwr.downloadHandler.data
函数用于设置请求的标头。
获取请求:
SetRequestHeader
使用表单的POST请求:
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);
}
}
使用Json的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);
}
}
使用Multipart FormData / Multipart Form文件的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);
}
}
PUT请求:
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);
}
}
删除请求:
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 :(得分:1)
https://www.patrykgalach.com/2019/04/18/how-to-call-rest-api-in-unity/
请参考此链接以最干净的方式玩数据
并且不要使用 www
而不是使用 UnityWebRequest
答案 2 :(得分:0)
使用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,并在此处重复使用