Pergunta

Eu configurei uma rota personalizada funcional para a API REST do Magento.

Funciona bem para solicitações GET, pois o _retrieve() função do correspondente V1.php class está sendo chamada conforme esperado e retorna os dados.Mas agora estou tentando lidar com solicitações POST e é aí que o Magento está se comportando de maneira estranha:

  • Quando você deseja postar dados, você deve definir os dados como uma coleção em vez de uma entidade em etc/api2.xml assim: <action_type>collection</action_type>.Caso contrário, o Magento lançará este erro Mage_Api2_Model_Resource (linha 207):
// Creation of objects is possible only when working with collection
$this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);

Então, quando eu defino o action_type como coleção, então o _multiCreate() função do correspondente V1.php está sendo chamado conforme o esperado.

  • No entanto, o Magento agora não me permite retornar nenhum dado.Quero retornar esse array no formato JSON:

    $response = array("success"=>true, "error"=>"", "model"=>array(1,2,3));

'sucesso', 'erro' e 'modelo' são definidos como atributos no api2.xml e, portanto, devem estar disponíveis.Mas quando eu voltar $response, a resposta está vazia com o status 207 ...Hmmm!Agora como tem coleção action_type, também tentei retornar o $response enrolado dentro de outro array, mas sem sucesso.

Nos meus testes finais, descobri que, ao definir os dados com o método $this->getResponse()->addMessage(....) Consigo recuperar dados, mas não acho que essa seja a maneira correta, pois é considerada para tipos de mensagens de sucesso/erro/aviso e não atende aos meus requisitos de tipo de dados.

Por último, mas não menos importante, também tentei retornar dados usando o $this->getResponse()->setBody($result) e $this->getResponse()->setRawBody($result) métodos, mas novamente - sem sucesso:

Então, especialistas em Magento - Qual é a maneira correta de recuperar dados de uma solicitação POST para a API REST?Preciso desesperadamente da sua ajuda!!

Aqui está o meu api2.xml:

<customer_login translate="title" module="Test_Restapi">
    <group>restapi</group>
    <model>restapi/api2_customer_login</model>
    <title>Blablabla</title>
    <sort_order>10</sort_order>
    <privileges>
        <customer>
            <create>1</create>
            <update>1</update>
            <retrieve>1</retrieve>
        </customer>
        <guest>
            <create>1</create>
            <update>1</update>
            <retrieve>1</retrieve>
        </guest>
    </privileges>
    <attributes>
        <success>Success</success>
        <error>Error</error>
        <model>Model</model>
    </attributes>
    <routes>
        <route_collection>
            <route>/restapi/customer/login</route>
            <action_type>collection</action_type>
        </route_collection>
    </routes>
    <versions>1</versions>
</customer_login>
Foi útil?

Solução

Se você der uma olhada na aula Mage_Api2_Model_Resource que deve ser estendido pela sua classe, você pode encontrar a função _render().

Examinando dispach() função desta classe, você pode ver que _render() a função é chamada por operações de recuperação.Então você pode usar esta função no final de sua ação assim $this->_render($data).

Esta função não é usada pelas operações de criação, que apenas definem o cabeçalho Location para o URL do recurso recém-criado.

Para aproveitar as vantagens da filtragem de atributos, use $this->getFilter()->out($data) antes $this->_render($data)

Mage_Api2_Model_Resource::dispatch() pode responder muitas perguntas sobre magento REST!

Outras dicas

Consegui recuperar dados do _createMulti() funcione seguindo as sugestões de @raivis.krumins.Dentro de dispatch() função do Mage_Api2_Model_Resource class eu adicionei essas 3 linhas após a linha 228 no final do if instrução onde o cabeçalho do local está sendo definido:

$retrievedData = $this->_createMulti($filteredData);
$returnData  = $this->getFilter()->out($retrievedData);
$this->_render($returnData);

A primeira linha recupera o resultado da função, a segunda linha filtra atributos indesejados (aqueles não definidos em api2.xml) e finalmente a terceira linha retorna os dados da resposta.

Observe que essas alterações devem sempre ser feitas em um módulo personalizado.Nunca mude uma classe principal!

Pouco antes de novas execuções em seu conjunto de funções de módulo personalizado

$this->getResponse()->appendBody(json_encode($response));

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top