获取Drupal服务模块JSON响应:Backbone.js模型属性变为字符串
我已经使用Drupal的服务模块设置了web服务。它通过Backbone.js前端应用程序为我输出JSON 我对这个设置有问题。如果我通过Backbone.js的一个模型的fetch方法请求数据,那么在获取之后,该模型的属性都被类型化为string,而有些属性应该是integer 例如:获取Drupal服务模块JSON响应:Backbone.js模型属性变为字符串,backbone.js,drupal-7,drupal-services,Backbone.js,Drupal 7,Drupal Services,我已经使用Drupal的服务模块设置了web服务。它通过Backbone.js前端应用程序为我输出JSON 我对这个设置有问题。如果我通过Backbone.js的一个模型的fetch方法请求数据,那么在获取之后,该模型的属性都被类型化为string,而有些属性应该是integer 例如: 我已经启用了用户资源,这是Drupal服务模块中的标准配置 我可以请求用户,例如: http://mydevmachine/services/user/8 …这将导致以下响应(从实际响应中精简版本):
- 我已经启用了用户资源,这是Drupal服务模块中的标准配置
- 我可以请求用户,例如:
http://mydevmachine/services/user/8
- 我在上面web服务的响应中看到,所有值都被引用,但是uid实际上不是字符串,而是数据库中的整数
- 如果我在Backbone.js模型中获取相同的用户,通过将模型的uid字段设置为8(整数),然后调用fetch方法。获取后,uid字段被键入为“字符串”
- Drupal服务模块输出的JSON格式是否符合标准
- JSON输出格式在Drupal服务模块中是可配置的还是可重写的
- 在Backbone.js中获取后是否可能保留模型属性的类型
- 我是否应该为主干网的collection comparator函数提供一个具体的实现,该函数可以处理这种情况(看起来像hackey)
- 我是否应该介绍其他解决方案,例如,如张贴在此处:(感觉太重)
谢谢您的帮助。所以我终于设法解决了这个问题,我在这里找到了解决方案:。我想我应该把解决方案记录下来 Drupal7使用PDO。使用PDO获取的结果,使用Drupal的默认PDO设置会产生字符串化的值 在Drupal的includes/database.inc文件中,您可以在第40-50行找到以下内容:
$connection_options['pdo'] += array(
// So we don't have to mess around with cursors and unbuffered queries by default.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
// Because MySQL's prepared statements skip the query cache, because it's dumb.
PDO::ATTR_EMULATE_PREPARES => TRUE,
);
此处MySQL准备好的语句跳过查询缓存的说法并不完全正确,可以在此处找到:。它声明MySQL>5.1.17准备好的语句在某些条件下使用查询缓存
我使用其他堆栈溢出问题/答案中的信息覆盖Drupal的sites/default/settings.php中数据库连接的PDO设置(请注意,我只对我正在查询的数据库这样做,这与Drupal自己的数据库不同):
这导致整数成为整数。PDO仍然错误地返回浮点数/小数,但这是另一个问题。至少我的问题现在已经解决了。您可以在主干网中设置方法作为最后手段,但必须有一种方法使您的服务器将发送的数字视为JSON中的数字。嗯,我还没有想到这个方法。事实上,如果我这样做的话,感觉有点像双重工作,但这也可能是在确保您接收正确数据的基础上的额外一层。谢谢你的回答!
$connection_options['pdo'] += array(
// So we don't have to mess around with cursors and unbuffered queries by default.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
// Because MySQL's prepared statements skip the query cache, because it's dumb.
PDO::ATTR_EMULATE_PREPARES => TRUE,
);
'database_name' =>
array (
'default' =>
array (
'database' => 'database_name',
'username' => 'user_name',
'password' => 'user_pass',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
'pdo' => array(
PDO::ATTR_STRINGIFY_FETCHES => FALSE,
PDO::ATTR_EMULATE_PREPARES => FALSE
),
),
),