【发布时间】: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 代码。注意:_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 无法序列化顶级数组。
【问题讨论】:
-
你能改变统一方面的东西,这样它不是
words的值是一个 json 编码的字符串,而是整个 params 对象被发送? (您将参数作为 json 有效负载发送,而不是在 url 中) -
也许您可以在发送请求的地方显示统一代码
-
好的,在底部编辑了 Unity 代码。
-
回复:params 对象。我相信整个 params 对象已经是一个 JSON 编码的字符串。再次编辑以显示我删除请求标头时的 Rails 日志。
-
您能展示一下您是如何构建
_PostData的吗?我有预感你正在手动序列化它的一部分,所以事情正在被双重序列化
标签: ruby-on-rails json ruby http unity3d