-
問題描述
用U3d的UnityWebRequest類Post數據時,服務端返回報錯信息:"Solve request fail. Post data format problem."而使用python腳本模擬Post時卻不會報錯,正常返回結果。 -
問題定位
首先,U3d和服務端是能正常通信的,返回的報錯信息是來自服務器程序的返回json中的errorinfo。用fillder查看從u3d訪問和python腳本訪問的區別,發現Content-Type的類型不同。
u3d中的WWWForm默認使用了"application/x-www-form-urlencoded",而python腳本的沒有定義,且python腳本中是把數據組織成json格式發送的。 -
問題原因
http協議中的請求頭中的Content-Type是用來定義消息體里的數據是怎么編碼的。
application/x-www-form-urlencoded: 序列化數據,以“鍵值對”用&連接鍵的方式。
application/json: 消息體中數據以json的格式編碼
multipart/form-data: 用二進制傳輸,有分隔符
text/plain: 純文本傳輸 -
解決方法
//postParams是傳參的對象,通過對json字符串用UTF8編碼
byte[] postBytes= Encoding.UTF8.GetBytes(JsonUtility.ToJson(postParams));
UnityWebRequest uwr = new UnityWebRequest(url, "POST");
uwr.uploadHandler = new UploadHandlerRaw(postBytes);
uwr.downloadHandler = new DownloadHandlerBuffer();
//設置Content-Type類型
uwr.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
yield return uwr.SendWebRequest();