Ruby on rails ActionDispatch::ParamSpaser::字符串请求负载的ParseError
我收到一个API的标准请求。它看起来像这样: 其内容类型和长度为: 但是,当这个消息到达我的Rails服务器时,Rails会以 我之所以提出这个问题,是因为相同的请求似乎在SCORM Cloud的服务器上起作用。如果我将完全相同的内容上传到它们,并在调试器中查看,我会看到它发出一个Ruby on rails ActionDispatch::ParamSpaser::字符串请求负载的ParseError,ruby-on-rails,ruby,json,scorm,tin-can-api,Ruby On Rails,Ruby,Json,Scorm,Tin Can Api,我收到一个API的标准请求。它看起来像这样: 其内容类型和长度为: 但是,当这个消息到达我的Rails服务器时,Rails会以 我之所以提出这个问题,是因为相同的请求似乎在SCORM Cloud的服务器上起作用。如果我将完全相同的内容上传到它们,并在调试器中查看,我会看到它发出一个application/json语句,该语句具有相同的请求负载,但没有意外标记错误 Rails应用程序/json请求是否必须以与其他服务器不同的方式编写?是否有适当的方法在机架中间件中重写此行以防止此错误 更新
application/json
语句,该语句具有相同的请求负载,但没有意外标记
错误
Rails应用程序/json
请求是否必须以与其他服务器不同的方式编写?是否有适当的方法在机架中间件中重写此行以防止此错误
更新
javascript:
function _TCDriver_XHR_request (lrs, url, method, data, callback, ignore404, extraHeaders) {
_TCDriver_Log("_TCDriver_XHR_request: " + url);
var xhr,
finished = false,
xDomainRequest = false,
ieXDomain = false,
ieModeRequest,
title,
ticks = ['/', '-', '\\', '|'],
location = window.location,
urlParts,
urlPort,
result,
extended,
until,
fullUrl = lrs.endpoint + url
;
urlParts = fullUrl.toLowerCase().match(/^(.+):\/\/([^:\/]*):?(\d+)?(\/.*)?$/);
// add extended LMS-specified values to the URL
if (lrs.extended !== undefined) {
extended = [];
for (var prop in lrs.extended) {
if(lrs.extended[prop] != null && lrs.extended[prop].length > 0){
extended.push(prop + "=" + encodeURIComponent(lrs.extended[prop]));
}
}
if (extended.length > 0) {
fullUrl += (fullUrl.indexOf("?") > -1 ? "&" : "?") + extended.join("&");
}
}
//Consolidate headers
var headers = {};
headers["Content-Type"] = "application/json";
headers["Authorization"] = lrs.auth;
if (extraHeaders !== null) {
for (var headerName in extraHeaders) {
headers[headerName] = extraHeaders[headerName];
}
}
//See if this really is a cross domain
xDomainRequest = (location.protocol.toLowerCase() !== urlParts[1] || location.hostname.toLowerCase() !== urlParts[2]);
if (! xDomainRequest) {
urlPort = (urlParts[3] === null ? ( urlParts[1] === 'http' ? '80' : '443') : urlParts[3]);
xDomainRequest = (urlPort === location.port);
}
//If it's not cross domain or we're not using IE, use the usual XmlHttpRequest
if (! xDomainRequest || typeof XDomainRequest === 'undefined') {
_TCDriver_Log("_TCDriver_XHR_request using XMLHttpRequest");
xhr = new XMLHttpRequest();
xhr.open(method, fullUrl, callback != null);
for (var headerName in headers) {
xhr.setRequestHeader(headerName, headers[headerName]);
}
}
//Otherwise, use IE's XDomainRequest object
else {
_TCDriver_Log("_TCDriver_XHR_request using XDomainRequest");
ieXDomain = true;
ieModeRequest = _TCDriver_GetIEModeRequest(method, fullUrl, headers, data);
xhr = new XDomainRequest ();
xhr.open(ieModeRequest.method, ieModeRequest.url);
}
Rails应用程序/json请求是否必须以与其他服务器不同的方式编写
据我所知没有
是否有适当的方法在机架中间件中重写此行以防止此错误
有一种方法是肯定的,甚至可能没有机架中间件,尽管在没有实际请求的情况下很难为您提供帮助。Rails在这里是“有用的”,并且假设客户端正确使用了“内容类型”,并传递了一个与该内容类型实际匹配的值。换句话说,请求中的有效负载必须是可解析的JSON,并且传递的值不是有效的JSON
当您正在实现一个内部API,而该API并不打算实现最大的互操作性时,这对it来说是完全合理的。Rails不知道的是,LRS的文档存储应该是“哑”的,基本上允许客户机输入它想要的内容,然后输出它想要的内容,这就是为什么SCORM Cloud接受请求的原因,基本上它只存储内容类型和内容,然后根据请求将其返回
粘贴的代码来自一个非常旧的库,该库的内容类型头的实现很差。如果在某个主要电子学习创作工具的内容的相对较旧版本之外的任何地方发现了此代码,则应将其更新为使用最新版本,并改进内容类型处理
至于在Rails上实现这一点,很抱歉,我没有那么多的经验。大概有一个开关或什么东西可以关闭自动请求体解析,至少我使用过的大多数其他框架都有这种功能。您需要请求的哪一部分?我知道如何重写请求。但我不完全确定我必须重写它的哪一部分,以及如何使它不变形。这有意义吗?整个问题都会有帮助。啊,谢谢你的帮助。我包括了javascript。。我希望是jQuery。这是将请求发送给我的代码。以上更新。啊,非常感谢布莱恩的评论。最后我确实为这个(现在我可以说)糟糕的JS编写了一个Rails重写。非常感谢您的帮助。嘿@BrianJ.Miller,我很好奇您是否做了大量SCORM编程工作。如果你有几分钟的时间,我很乐意和你聊天。不是为了工作,只是觉得分享故事会很有趣。我在LRS公司工作了四年半,一直在写一个罐头阅读器,并注意到人们使用的样板罐头中有许多不规则的地方。我很好奇为什么他们不标准化这些东西。@Trip 4.5年听起来有点长。不管怎样,我都不知道你所说的“罐头代表的样板类型”是什么意思。语句结构的标准化正在向前推进,尽管进展缓慢,我们已经发布了关于“食谱”概念的材料,旨在建议发布常见习语的最佳实践。看到高兴地回答进一步的问题,我注意到了,还是可以发到support@tincanapi.com.