Для Magento 1.9 я работаю над модулем, где я определил настраиваемый маршрут REST для получения всех категорий с подкатегориями. Когда я вызываю <MAGE>/api/rest/eoarestapi/categories?type=rest
_retrieveCollection()
функция _retrieveCollection()
из класса Namespace_Restapi_Model_Api2_Category_Rest_Guest_V1
. Все идет нормально.
Теперь у меня возникла проблема, что он возвращает ответ только в XML и когда я устанавливаю заголовок явно в Accept: application/json
, тогда я получаю ошибку 406 Не приемлемо. Соответствующее представление запрашиваемого ресурса /api/rest/products не удалось найти на этом сервере. Доступные варианты: api.php, тип application/x-httpd-php
Это кажется мне очень странным, так как я помню, как я работал с JSON-ответом в Magento 1.8.
В качестве исправления я нашел это и это решение для извлечения JSON, который работает, но он не кажется хорошим решением, поскольку похоже, что он полностью отключает ответ XML.
Есть ли лучший способ включить вывод JSON из REST API в Magento 1.9? Кто-нибудь знает об этом?
Я достиг этого, переопределив мою модель запроса. Мои шаги следующие:
1: объявить новый модуль: создать приложение /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));
}
}