在Unity3D中使用json作为post数据

  1. 问题描述
    用U3d的UnityWebRequest类Post数据时,服务端返回报错信息:"Solve request fail. Post data format problem."而使用python脚本模拟Post时却不会报错,正常返回结果。

  2. 问题定位
    首先,U3d和服务端是能正常通信的,返回的报错信息是来自服务器程序的返回json中的errorinfo。用fillder查看从u3d访问和python脚本访问的区别,发现Content-Type的类型不同。
    u3d中的WWWForm默认使用了"application/x-www-form-urlencoded",而python脚本的没有定义,且python脚本中是把数据组织成json格式发送的。

  3. 问题原因
    http协议中的请求头中的Content-Type是用来定义消息体里的数据是怎么编码的。
    application/x-www-form-urlencoded: 序列化数据,以“键值对”用&连接键的方式。
    application/json: 消息体中数据以json的格式编码
    multipart/form-data: 用二进制传输,有分隔符
    text/plain: 纯文本传输

  4. 解决方法

        //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();
posted @ 2021-08-26 16:45  蓝闪  阅读(830)  评论(0编辑  收藏  举报