我已经使用Drupal的服务模块设置了web服务。它为我输出JSON,我通过Backbone.js前端应用程序请求该JSON。
我对这个设置有意见。如果我通过模型的Backbone.js的fetch方法请求数据,那么模型的属性在提取后都被类型化为字符串,而有些属性应该是integer。
例如:
- 我已经启用了用户资源,这是Drupal服务模块中的标准资源
-
我可以请求用户,例如:
http://mydevmachine/services/user/8
这导致以下响应(从实际响应中精简的版本):
{"uid":"8","name":"itsme","mail":"me@mydomain.nl"}
- 我在上面web服务的响应中看到,所有值都被引用了,但是uid实际上不是字符串,而是数据库中的整数
- 如果我在Backbone.js模型中获取相同的用户,通过将模型的uid字段设置为8(整数),然后调用fetch方法。获取uid字段后,该字段被键入为"string"
我假设上面的情况导致我的模型最终得到的uid属性不是integer,而是string。我使用自己的实体创建的所有其他web服务资源也会发生这种情况。
由于使用Backbone的集合排序存在排序问题,我需要在模型中正确键入属性。也就是说,使用"integer"类型的字段对模型集合进行排序会导致在使用相同值对字段进行排序时产生不同的排序结果,尽管该字段存储为字符串。
我不知道该去哪里看:
- Drupal服务模块输出的JSON格式是否符合标准
- JSON输出格式在Drupal服务模块中是可配置的还是可重写的
- 在Backbone.js中提取后,是否可以保留模型属性的类型
- 我应该为Backbone的收集比较器功能提供一个具体的实现吗?它可以处理这种情况(看起来很古怪)
- 我应该介绍其他解决方案吗,比如这里发布的:我如何在骨干模型中强制执行属性类型?(感觉太重了)
谢谢你的帮助。
所以我终于解决了这个问题,并在这里找到了我的解决方案:如何使用PDO从MySQL中获取数字类型?。我想我应该把解决方案记录下来。
Drupal 7使用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准备好的语句跳过查询缓存的说法并不完全正确,可以在这里找到:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html.声明MySQL>5.1.17准备好的语句在特定条件下使用查询缓存。
我使用了来自其他堆栈溢出问题/答案的信息来覆盖Drupal网站/default/settings.php中数据库连接的PDO设置(请注意,我只为我查询的数据库做了这件事,这与Drupal自己的数据库不同):
'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
),
),
),
这导致整数成为整数。浮动/小数仍然被PDO错误地返回,但这是不同的问题。至少我的问题现在解决了。