Получение ценности с помощью javascript и REST api



Проблема на самом деле определяется в два этапа:
1. Как определить Api REST, который возвращает массив?
2. Как использовать этот REST Api через javascript?

Описание:
Что я сделал, но не добился результатов:

etc/frontend/webapi.xml:

<?xml version="1.0"?> <routes
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">

    <route url="/V1/shetab/transaction/refid" method="POST">
        <service class="Amaj\ShetabPayment\Api\ShetabServiceInterface" method="getTransRefId"/>
        <resources>
            <resource ref="anonymous" /><!-- works even if user has been logged of -->
        </resources>
    </route>

</routes>


etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Amaj\ShetabPayment\Api\ShetabServiceInterface"
                type="Amaj\ShetabPayment\Model\ShetabService" />
</config>


Api/ShetabServiceInterface.php:

interface ShetabServiceInterface
{
    /** Returns Transaction Reference ID
     *
     * @param int $quoteId
     * @return string|null
     */
    public function getTransRefId($quoteId);
}


Model/ShetabService.php:

namespace Amaj\ShetabPayment\Model;

interface ShetabService implements \Amaj\ShetabPayment\Api\ShetabServiceInterface
{
    protected $_logger;

    public function __construc(
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->_logger = $logger;
    }


    /** Returns Transaction Reference ID
     *
     * @param int $quoteId
     * @return string|null
     */
    public function getTransRefId($quoteId)
    {
        $this->_logger->info('getTransRefId is called: ' . $quoteId);
        $result = array(
            'transRefId' => 50
        );
        return json_encode($result);
    }
}


Код Javascript:

define(
    [
        'jquery',
        'Magento_Checkout/js/model/url-builder',
        'mage/storage',
        'Magento_Checkout/js/model/error-processor',
        'Magento_Checkout/js/model/full-screen-loader'
    ],
    function (
        $,
        urlBuilder,
        storage,
        errorProcessor,
        fullScreenLoader
    ) {
        'use strict';

        return {
            getTransRefId: function(quoteId, messageContainer) {

                var result = storage.post(
                    urlBuilder.createUrl('/shetab/transaction/refid', {}),
                    JSON.stringify({
                        quoteId: quoteId
                    })

                ).fail(
                    function (response) {
                        errorProcessor.process(response, messageContainer);
                        fullScreenLoader.stopLoader();
                    }
                );
                console.log( JSON.stringify(result.responseText) );
            }
        };


    }
);
Author: Khoa TruongDinh, 2017-02-08

2 answers

"Request does not match any route." появляется из-за неправильного пути webapi.xml.

Вы должны переместить его в etc/webapi.xml.

Также ваш файл Model/ShetabService.php содержит ошибки:

  • class ShetabService, а не interface
  • опечатка в __construct имени функции (последнее t пропущено)

Здесь исправлено одно:

namespace Amaj\ShetabPayment\Model;

class ShetabService implements \Amaj\ShetabPayment\Api\ShetabServiceInterface
{
    private $_logger;

    public function __construct(\Psr\Log\LoggerInterface $logger) {
        $this->_logger = $logger;
    }


    /** Returns Transaction Reference ID
     *
     * @param int $quoteId
     * @return string|null
     */
    public function getTransRefId($quoteId)
    {
        $this->_logger->info('getTransRefId is called: ' . $quoteId);
        $result = array(
            'transRefId' => 50
        );
        return json_encode($result);
    }
}
 3
Author: yaronish, 2017-02-09 10:31:03

Ваш метод Api должен содержать аннотации: @api, параметры и возвращаемые значения, например:

namespace Amaj\ShetabPayment\Api;

interface ShetabServiceInterface
{

    /**
     * @api
     * @param string $quoteId
     * @return string|null
     */
    public function getTransRefId($quoteId);
}
  1. Как определить REST Api, который возвращает массив?

Он должен возвращать формат Json. Потому что ответ от Web Api уже задает тип json для заголовка. Javascript может легко обрабатывать тип Json.

  1. Как использовать этот REST Api с помощью javascript

Мы должны взглянуть: vendor/magento/module-checkout/view/frontend/web/js/action/set-payment-information.js

 2
Author: Khoa TruongDinh, 2017-02-09 00:38:50