解析从 Unity 发送到 Ruby On Rails 的 JSON POST 数据



我正在为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'

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

_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 代码。注意:_PostData是一个Dictionary<string, string>

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无法序列化顶级数组。

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

在轨道中:

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;

最新更新