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解码话,打印出的结果里有%(特殊字符和中文无法正常显示)

UnityWebRequest.Post源码

解决方案:不进行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");
     }
 }

猜你喜欢

转载自blog.csdn.net/weixin_41155760/article/details/126706231