Tag: codegenerator

  • Use Swagger to generate a full functional Magento API Client

    Use Swagger to generate a full functional Magento API Client

    Magento 2 comes with a nice swagger schema which describes the Webapi. The Magento guys were very clever to choose swagger. It not only comes with a schema, but moreover it is a complete interactive API client as well.

    A swagger schema is a JSON document to formalize the REST API. Formalized documents have the big advantage that you can process the data with a machine. One idea I had was to create a PHP API for the Magento 2 API. Fortunately the swagger guys created a code generator tool. I really like the idea to generate code out of the schema. The swagger code-gen tool comes with support for multiple languages. PHP is one of the standard languages.

    The code generator tool can be found here: http://swagger.io/swagger-codegen/

    If you are on a mac it’s possible to install the code generator with homebrew.

    brew install swagger-codegen

    After the installation you can test the tool with the help command.

    swagger-codegen help

    On my machine i can see this help output. Works!

    usage: swagger-codegen-cli <command> [<args>]
    
    The most commonly used swagger-codegen-cli commands are:
        config-help   Config help for chosen lang
        generate      Generate code with chosen lang
        help          Display help information
        langs         Shows available langs
        meta          MetaGenerator. Generator for creating a new template set and configuration for Codegen.  The output will be based on the language you specify, and includes default templates to include.
        version       Show version information
    
    See 'swagger-codegen-cli help <command>' for more information on a specific
    command.

    Run the generator

    Now we are able to run the code generator. I used the schema from public developer documentation. You can also use your own schema from an existing installation.

    swagger-codegen generate -i http://devdocs.magento.com/swagger/schemas/latest-2.1.schema.json -l php
    cd SwaggerClient-php
    composer install --prefer-dist

    You should see a long list of generated classes like this:

    Run test unit tests

    After the code generation is done, we should run the generated unit tests. You can run the tests by typing vendor/bin/phpunit in the project folder.

    Test the new generated client

    After that we can try our freshly generated API client library.

    As an example we will fetch all the installed Magento modules of our shop instance.

    <?php
    require_once __DIR__ . '/vendor/autoload.php';
    
    $baseUrl = '{{YOUR_SHOP_URL}}/rest';
    $token = 'bearer {{YOUR_API_TOKEN}}';
    
    $config = new \Swagger\Client\Configuration();
    $config->setHost($baseUrl);
    $config->addDefaultHeader('Authorization', $token);
    
    $apiClient = new \Swagger\Client\ApiClient($config);
    
    $apiInstance = new \Swagger\Client\Api\BackendModuleServiceV1Api($apiClient);
    
    try {
        $result = $apiInstance->backendModuleServiceV1GetModulesGet();
        print_r($result);
    } catch (Exception $e) {
        echo $e->getMessage();
    }

    Save the script as installed_modules.php and replace {{YOUR_SHOP_URL}}  with a local or remote shop url and {{YOUR_API_TOKEN}} with a API bearer token of your user. A brief description about the generation of API-Tokens can be found in the developer documentation topic “Token-based authentication“.

    Now run the script with php installed_modules.php.

    On my local machine I am getting this output:

    Array
    (
        [0] => Magento_Store
        [1] => Magento_AdvancedPricingImportExport
        [2] => Magento_Directory
        [3] => Magento_Theme
        [4] => Magento_Backend
        [5] => Magento_Backup
        [6] => Magento_Eav
        [7] => Magento_Customer
        [8] => Magento_BundleImportExport
        [9] => Magento_AdminNotification
        [10] => Magento_CacheInvalidate
        [11] => Magento_Indexer
        [12] => Magento_Cms
        [13] => Magento_CatalogImportExport
        [14] => Magento_Catalog
        [15] => Magento_Rule
        [16] => Magento_Msrp
        [17] => Magento_Search
        [18] => Magento_Bundle
        [19] => Magento_Quote
        [20] => Magento_CatalogUrlRewrite
        [21] => Magento_Widget
        [22] => Magento_SalesSequence
        [23] => Magento_CheckoutAgreements
        [24] => Magento_Payment
        [25] => Magento_Downloadable
        [26] => Magento_CmsUrlRewrite
        [27] => Magento_Config
        [28] => Magento_ConfigurableImportExport
        [29] => Magento_CatalogInventory
        [30] => Magento_SampleData
        [31] => Magento_Contact
        [32] => Magento_Cookie
        [33] => Magento_Cron
        [34] => Magento_CurrencySymbol
        [35] => Magento_CatalogSearch
        [36] => Magento_CustomerImportExport
        [37] => Magento_CustomerSampleData
        [38] => Magento_Deploy
        [39] => Magento_Developer
        [40] => Magento_Dhl
        [41] => Magento_Authorization
        [42] => Magento_User
        [43] => Magento_ImportExport
        [44] => Magento_Sales
        [45] => Magento_CatalogRule
        [46] => Magento_Email
        [47] => Magento_EncryptionKey
        [48] => Magento_Fedex
        [49] => Magento_GiftMessage
        [50] => Magento_Checkout
        [51] => Magento_GoogleAnalytics
        [52] => Magento_GoogleOptimizer
        [53] => Magento_GroupedImportExport
        [54] => Magento_GroupedProduct
        [55] => Magento_Tax
        [56] => Magento_DownloadableImportExport
        [57] => Magento_Braintree
        [58] => Magento_Integration
        [59] => Magento_LayeredNavigation
        [60] => Magento_Marketplace
        [61] => Magento_MediaStorage
        [62] => Magento_ConfigurableProduct
        [63] => Magento_MsrpSampleData
        [64] => Magento_Multishipping
        [65] => Magento_NewRelicReporting
        [66] => Magento_Newsletter
        [67] => Magento_OfflinePayments
        [68] => Magento_SalesRule
        [69] => Magento_OfflineShipping
        [70] => Magento_PageCache
        [71] => Magento_Captcha
        [72] => Magento_Paypal
        [73] => Magento_Persistent
        [74] => Magento_ProductAlert
        [75] => Magento_Weee
        [76] => Magento_ProductVideo
        [77] => Magento_CatalogSampleData
        [78] => Magento_Reports
        [79] => Magento_RequireJs
        [80] => Magento_Review
        [81] => Magento_BundleSampleData
        [82] => Magento_Rss
        [83] => Magento_DownloadableSampleData
        [84] => Magento_Authorizenet
        [85] => Magento_OfflineShippingSampleData
        [86] => Magento_ConfigurableSampleData
        [87] => Magento_SalesSampleData
        [88] => Magento_ProductLinksSampleData
        [89] => Magento_ThemeSampleData
        [90] => Magento_ReviewSampleData
        [91] => Magento_SendFriend
        [92] => Magento_Ui
        [93] => Magento_Sitemap
        [94] => Magento_CatalogRuleConfigurable
        [95] => Magento_Swagger
        [96] => Magento_Swatches
        [97] => Magento_SwatchesSampleData
        [98] => Magento_GroupedProductSampleData
        [99] => Magento_TaxImportExport
        [100] => Magento_TaxSampleData
        [101] => Magento_GoogleAdwords
        [102] => Magento_CmsSampleData
        [103] => Magento_Translation
        [104] => Magento_Shipping
        [105] => Magento_Ups
        [106] => Magento_UrlRewrite
        [107] => Magento_CatalogRuleSampleData
        [108] => Magento_Usps
        [109] => Magento_Variable
        [110] => Magento_Version
        [111] => Magento_Webapi
        [112] => Magento_SalesRuleSampleData
        [113] => Magento_CatalogWidget
        [114] => Magento_WidgetSampleData
        [115] => Magento_Wishlist
        [116] => Magento_WishlistSampleData
        [117] => N98_Tutorial
        [118] => N98_Tutorial2
    )

    Conclusion

    That’s it. We have a full functional REST API client in PHP to call Magento 2 instances. The generated code is not perfect but very usable.

    You can try it by yourself. For all lazy developers we pushed the code in a public github repository.

    https://github.com/netz98/magento2-swagger-api-client-demo

    Have fun!