unity中的网络请求,最方便、常用的如下两种方法。分别实现GET/POST。实际设计项目时,基础的表单POST显得相对简陋,后端往往需要添加许多验证。本文就主要介绍这些情况下,携带header头发送Post请求的注意事项,案例中需要用到LitJson。
WWW www = new WWW(url); //GET
WWW www = new WWW(url, form); //POST
一、原生WWW方法。
需要说明一下,www的第四种重载,在许多博客包括官方示例里面都还是Hashtable,实际情况是在5.0以前已经使用Dictionary<string, string>了。
WWW www = new WWW(string url, byte[] body, Dictionary<string,string> header);
WWW因为许多局限性在将来也会逐渐被边缘化,比如API中form-data是无法带header的,必须转成二进制数据。后端也要把multipart/form-data改成application/json。
using System.Collections;
using UnityEngine;
using LitJson;
public class Example1 : MonoBehaviour
{
string url = "http://localhost/demo.php";
IEnumerator Start()
{
JsonData data = new JsonData();
data["license"] = "17N6-UE25-3333-WSCH-LONG";
byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());
Dictionary<string, string> header = new Dictionary<string, string>();
//header["Content-Type"] = "application/json"; //两种方法
header.Add("Content-Type", "application/json");
WWW www = new WWW(url, postBytes, header);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
}
Debug.Log(www.text);
}
}
二、原生UnityWebRequest,需要引用UnityEngine.Networking,也是未来的主流方法。
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using LitJson;
public class Example2 : MonoBehaviour
{
string url = "http://localhost/demo.php";
IEnumerator Start()
{
var request = new UnityWebRequest(url, "POST");
JsonData data = new JsonData();
data["license"] = "17N6-UE25-3333-WSCH-LONG";
byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("CLEARANCE", "I_AM_ADMIN");
yield return request.Send();
Debug.Log("Status Code: " + request.responseCode);
if (request.responseCode == 200)
{
string text = request.downloadHandler.text;
Debug.Log(text);
}
}
}
三、使用UniWeb插件Post(确保项目中导入UniWeb)
using System.Collections;
using UnityEngine;
using LitJson;
public class Example3 : MonoBehaviour
{
string url = "http://localhost/demo.php";
IEnumerator Start()
{
// body部分
JsonData data = new JsonData();
data["license"] = "58V2E-CCKCJ-B8VSE-MEW9Y-ACB2K 5Z62E-79JDV-79NAM-ZGVE6-ARBWY";
byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());
HTTP.Request r = new HTTP.Request("POST", url, postBytes);
// Header部分
r.headers.Clear();
r.headers.Add("Content-Type", "application/json");
r.timeout = 3; //设定超时时间
yield return r.Send();
// 异常处理
if (r.exception != null)
{
Debug.Log("post request error: " + r.exception.ToString());
// 超时
if (r.exception is System.TimeoutException)
{
Debug.Log("Request timed out.");
}
// 其他报错
else
{
Debug.Log("Exception occured in request.");
}
}
else if (r.response.status != 200)
{
Debug.Log("post request code:" + r.response.status);
}
// 成功
else
{
Debug.Log("post Success!!");
Debug.Log("returned data:" + r.response.Text);
}
// 完成通信
Debug.Log("WWW Done. " + url);
}
}
四、C#网络请求HttpWebRequest
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;
using LitJson;
public class wwwpost : MonoBehaviour
{
static string url = "http://www.setsuodu.com/demo.php";
void Start()
{
JsonData data = new JsonData();
data["Token"] = "acdc";
data["action"] = "get_config";
data["userid"] = "10086";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data.ToJson());
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = bytes.Length;
request.Headers.Add("Auther", "user_id");
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bytes, 0, bytes.Length);
}
//处理响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream responseStm = response.GetResponseStream())
{
StreamReader redStm = new StreamReader(responseStm, Encoding.UTF8);
string result = redStm.ReadToEnd();
Debug.Log(result);
}
}
}