-
问题描述
用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();