【问题标题】:Parsing JSON POST data sent from Unity to Ruby On Rails解析从 Unity 发送到 Ruby On Rails 的 JSON POST 数据
【发布时间】:2018-02-04 15:45:05
【问题描述】:

我正在为 Unity 前端构建 Rails 服务。其中一个控制器在解析来自我的UnityWebRequest 的 JSON blob 时遇到问题。这是 Unity 所说的发送内容:

[StoryPost] Sending request to localhost:3000/stories/new with post data [words, {"_array":[{"_text":"mailing"}]}]

这是 Rails 在收到 JSON 时记录的内容:

Started POST "/stories/new" for 127.0.0.1 at 2017-08-26 20:08:40 -0400
    Error occurred while parsing request parameters.
    Contents:

    words=%7B%22_array%22%3A%5B%7B%22_text%22%3A%22mailing%22%7D%5D%7D

    ActionDispatch::Http::Parameters::ParseError (743: unexpected token at 'words=%7B%22_array%22%3A%5B%7B%22_text%22%3A%22mailing%22%7D%5D%7D'):

    actionpack (5.1.3) lib/action_dispatch/http/parameters.rb:113:in `rescue in parse_formatted_parameters'
    actionpack (5.1.3) lib/action_dispatch/http/parameters.rb:107:in `parse_formatted_parameters'

看起来我有某种编码错误。一旦我将以下代码添加到我的网络请求中,这种情况就开始发生:

_request.SetRequestHeader("Content-Type", "application/json");
_request.SetRequestHeader("Accept", "application/json");

如果我注释掉上面提到的两个 SetRequestHeader 调用,那么 Rails 记录的内容如下:

Started POST "/stories/new" for 127.0.0.1 at 2017-08-26 23:13:14 -0400
Processing by StoriesController#new as */*
Parameters: {"words"=>"{\"_array\":[{\"_text\":\"inspectors\"}]}"}

我添加了这段代码,以便 Rails 自动知道将我的 POST 数据解析为 JSON。以前有人见过这种类型的问题吗? Rails 和 HTTP 的新手,但 Unity 不是。

相关代码

作为参考,这是我的 Rails 控制器:

class StoriesController < ApplicationController      

    def new
      post_data = params["words"]
      words_array = post_data["_array"];
      puts "words " + words_array
      story = Story.new(words_array)
      story.save()
    end    
end

这是我的 Unity 代码。注意:_PostDataDictionary&lt;string, string&gt;

protected ServiceCall()
        {
            switch (_Type)
            {
                case RequestType.Get:
                    _request = UnityWebRequest.Get(_URL);
                    break;
                case RequestType.Post:
                    _request = UnityWebRequest.Post(_URL, _PostData);
                    break;
                default:
                    throw new NullReferenceException("Unknown request type " + _Type);
            }

            _request.SetRequestHeader("Content-Type", "application/json");
            _request.SetRequestHeader("Accept", "application/json");

            _request.downloadHandler = new DownloadHandlerBuffer();

            Diag.Crumb(this, $"Sending request to {_URL} with post data {_PostData.Pretty()}");

            _requestOperation = _request.Send();
        }

这是我正在构建的_PostData

    protected override Dictionary<string, string> _PostData 
    {
        get
        {
            var asArray = new JsonArray<Word>(Luke.GuessWords);
            string json = JsonUtility.ToJson(asArray);
            return new Dictionary<string, string>{{"words", json}};
        }
    }

JSONArray 只是一个具有_array 字段的简单类,因为Unity 的JsonUtility 无法序列化顶级数组。

【问题讨论】:

  • 你能改变统一方面的东西,这样它不是words 的值是一个 json 编码的字符串,而是整个 params 对象被发送? (您将参数作为 json 有效负载发送,而不是在 url 中)
  • 也许您可以在发送请求的地方显示统一代码
  • 好的,在底部编辑了 Unity 代码。
  • 回复:params 对象。我相信整个 params 对象已经是一个 JSON 编码的字符串。再次编辑以显示我删除请求标头时的 Rails 日志。
  • 您能展示一下您是如何构建_PostData 的吗?我有预感你正在手动序列化它的一部分,所以事情正在被双重序列化

标签: ruby-on-rails json ruby http unity3d


【解决方案1】:

针对我的整个 POST 正文未格式化为 JSON 的反馈,我改为更改 _PostData 以返回一个字符串,并在我的派生类中将 _PostData 序列化为 JSON。然后在基类中,我将 JSON 编码为字节并将其作为 POST 正文发送。这是我修改后的代码:

在 Rails 中:

def new
  words_array = params["_array"]
  puts "words " + words_array.to_s
  story = Story.new(words_array)
  puts "story is " + story.to_s
end

在统一中:

protected override string _PostData 
{
    get
    {
        var asArray = new JsonArray<Word>(Luke.GuessWords);
        string json = JsonUtility.ToJson(asArray);
        return json;
    }
}

还有……

case RequestType.Post:
    _request = UnityWebRequest.Post(_URL, new Dictionary<string, string>());
    _request.uploadHandler = new UploadHandlerRaw
    (
        Encoding.UTF8.GetBytes(_PostData)
    );
    break;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多