UnityWebRequest.Post问题
使用Post上传数据时,碰到乱码问题,总结一下:
Post上传数据:
using (UnityWebRequest request = UnityWebRequest.Post(url, data))
{
request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("上传成功!");
uploadSuccess?.Invoke();
}
}
上面的代码:Post方法会对data数据进行URL编码。
服务端如果没有进行URL解码话,打印出的结果里有%(特殊字符和中文无法正常显示)
解决方案:不进行URL编码,或服务端进行URL解码
1.使用PUT,方法设置为POST
因为Put方法没有进行URL编码
using (UnityWebRequest request = UnityWebRequest.Put(url, data))
{
//方法改为POST
request.method = UnityWebRequest.kHttpVerbPOST;
request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("上传成功!");
uploadSuccess?.Invoke();
}
}
2.使用更低级的API:自己控制数据
IEnumerator UpLoadTexture3(string data)
{
byte[] databyte = Encoding.UTF8.GetBytes(data);
var _request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
_request.uploadHandler = new UploadHandlerRaw(databyte);
_request.downloadHandler = new DownloadHandlerBuffer();
_request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
yield return _request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("上传成功!");
uploadSuccess?.Invoke();
}
}
3.服务端使用URL解码也可以
UnityWebRequest自带URL编码和解码,escape:转义
string str = UnityWebRequest.EscapeURL(data);
Debug.Log(UnityWebRequest.UnEscapeURL(str));
额外说点其他的:
上传本地文件:使用低级API非常方便
IEnumerator UpLoadTexture(string localPath)
{
string fileName = Path.GetFileNameWithoutExtension(localPath);
//url中补充上传的文件名
var request = new UnityWebRequest(url + fileName, UnityWebRequest.kHttpVerbPOST);
request.uploadHandler = new UploadHandlerFile(localPath);
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError(request.error);
}
else
{
Debug.Log("upload success");
}
}