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