如何将Drupal服务的默认响应格式更改为JSON?

如何将Drupal服务的默认响应格式更改为JSON?,json,drupal-7,mime-types,drupal-modules,drupal-services,Json,Drupal 7,Mime Types,Drupal Modules,Drupal Services,我正在使用Drupal服务和REST服务器来提供API。 以前我只处理一种类型的响应,JSON,所以我不需要额外的URL扩展名“.JSON” 现在我必须添加新的格式化程序XML。 然后问题开始了,所有不带任何扩展名(.json或.xml)的API将被设置为默认输出为xml 我试图跟踪这个问题,最后发现相关变量是“rest\u server\u default\u response\u format”。 服务模块上的相关代码为 所以我有$mime_的值 Array ( [0] => appl

我正在使用Drupal服务和REST服务器来提供API。
以前我只处理一种类型的响应,JSON,所以我不需要额外的URL扩展名“.JSON”

现在我必须添加新的格式化程序XML。
然后问题开始了,所有不带任何扩展名(.json或.xml)的API将被设置为默认输出为xml

我试图跟踪这个问题,最后发现相关变量是“rest\u server\u default\u response\u format”。
服务模块上的相关代码为

所以我有$mime_的值

Array ( [0] => application/xml [1] => text/xml [2] => application/json )
即使响应_格式在第87行已经设置为json, 但是mimeparse->best_match()返回“text/xml”

覆盖此项的最佳方法是什么?
我认为编辑getResponseFormatContentTypeNegotiations不是最好的方式。
有没有办法使最佳匹配函数更喜欢JSON格式而不是XML格式?

谢谢。

最好的方法是在您的请求中使用“接受”标题:

Accept: application/json

如果json可用,它将用作响应而不是xml。

通过管理UI,您可以修改已配置的服务,使其仅返回某些格式

结构>服务

然后编辑资源>服务器选项卡


然后,您可以选择响应格式并将其设置为专用json。

在最新版本的服务中,所有操作都发生在
Services/servers/rest\u server/includes/servicesContentTypeCongregation.inc
文件中的
getResponseFormatContentTypeCongregations()
中;具体而言,本部分:

// Get the best matching format, default to json
$response_format = variable_get('rest_server_default_response_format', 'json');
$http_accept = $context->getServerVariable('HTTP_ACCEPT');
if (!empty($http_accept)) {
  $mime = $this->mimeParse();
  $mime_type = $mime->best_match($mime_candidates, $http_accept);
  $response_format = isset($mime_map[$mime_type]) ? $mime_map[$mime_type] : '';
}
现在的情况是,它得到了一个默认的JSON格式化程序。然后它会查看您的请求的接受头。如果您的accept头没有指定有效的MIME类型,它将使用JSON

似乎所有现代浏览器都有一个名为“”的功能,默认情况下,它们基本上都指定首先接受HTML,然后接受XML(尽管这因浏览器而异)

因此,考虑到这一点,您希望客户机只需从其请求头中删除XML mimetype即可获得JSON。不那么不幸

如果请求包含任何“accept”头,那么代码将尝试将头与您启用的解析器列表相匹配(假设它只是XML、JSON),并且它将选择一个匹配的头,或者选择第一个。因此,如果您确实有一个accept头,但没有指定有效的MIME类型,服务将使用您启用的第一个MIME类型


要更改您启用的那些解析器的顺序,我认为您可以使用
服务中的一个钩子。alter.api.php

工作得非常好!非常感谢。