Magento在JSON中自定义REST API响应

时间:2015-01-16 17:47:30

标签: php api rest magento magento-1.9

对于Magento 1.9,我正在开发一个模块,我在该模块中定义了一个自定义REST路由,以检索具有子类别的所有类别。当我致电<MAGE>/api/rest/eoarestapi/categories?type=rest时,正在调用类_retrieveCollection()中的函数Namespace_Restapi_Model_Api2_Category_Rest_Guest_V1。到目前为止一切都很好。

现在我遇到了问题,它只返回XML响应,当我将标题明确设置为Accept: application/json时,我收到错误 406 Not Acceptable 在此服务器上找不到所请求资源/ api / rest / products的适当表示。可用的变体:api.php,类型application / x-httpd-php

这对我来说非常奇怪,因为我记得曾在Magento 1.8中使用过JSON响应。

作为修复,我找到thisthat解决方案来检索有效的JSON,但它似乎不是一个很好的解决方案,因为它看起来完全禁用了XML响应。 / p>

有没有更好的方法从Magento 1.9中的REST API启用JSON输出? 有没有人对此有一些背景知识?

2 个答案:

答案 0 :(得分:0)

我通过覆盖我的请求模型实现了这一点。我的步骤如下:

1:声明新模块:创建app / etc / modules / Custom_RestJson.xml

<?xml version="1.0"?>
<config>
<modules>
<Custom_RestJson>
<active>true</active>
<codePool>local</codePool>
</Custom_RestJson>
</modules>
</config>

<强> 2。创建/app/code/local/Custom/RestJson/etc/config.xml

<?xml version="1.0"?>
<config>
<modules>
<Custom_RestJson>
<version>1.0.0</version>
</Custom_RestJson>
</modules>
<global>
<models>
<Custom_RestJson>
<class>Custom_RestJson_Model</class>
</Custom_RestJson>
<api2>
<rewrite>
<request>Core_Mage_Api2_Model_Request</request>
</rewrite>
</api2>
</models>
</global>
</config>

第3。创建/app/code/local/Custom/RestJson/Model/Api2/Request.php

<?php
class Custom_RestJson_Model_Api2_Request extends Mage_Api2_Model_Request{

public function getAcceptTypes()
{
$qualityToTypes = array();
$orderedTypes = array();

foreach (preg_split('/,\s*/', $this->getHeader('Accept')) as $definition) {
$typeWithQ = explode(';', $definition);
$mimeType = trim(array_shift($typeWithQ));

// check MIME type validity
if (!preg_match('~^([0-9a-z*+\-]+)(?:/([0-9a-z*+\-\.]+))?$~i', $mimeType)) {
continue;
}
$quality = '1.0'; // default value for quality

if ($typeWithQ) {
$qAndValue = explode('=', $typeWithQ[0]);

if (2 == count($qAndValue)) {
$quality = $qAndValue[1];
}
}
$qualityToTypes[$quality][$mimeType] = true;
}
krsort($qualityToTypes);

foreach ($qualityToTypes as $typeList) {
$orderedTypes += $typeList;
}

return array_keys(array("application/json" => 1));
}

}

答案 1 :(得分:0)

首先,我在API接口中定义了 @return blend

与您的模型相比,我这样做

 $response = ['success' => 'ok', 'message' => 'json format'];
 header('Content-Type: application/json');
 echo json_encode($response); exit;