Share My Creation [Project Template] Web API Server 2

Version: 2.08
Description: Create Web API Server using B4X project template

Sample project: Support Ticketing System

Web API Server.png


If you don't want to connect to any SQL database, see MinimaList API Server
For older version, see Web API Server (v1.16)


Template:
  • Web API Server (2.08).b4xtemplate
Depends on:
GitHub:
Features:
  • ApiHandler and WebHandler are used for routing to Controller classes
  • HelpHandler (optional)
    • API documentation is generated automatically. You don't need external tools (e.g Postman or Swagger) for testing.
    • Access tokens can be embeded into request header in HelpHandler.
    • Controller classes are added to a list in Main module to show in the documentation.
  • Configuration
    • Web and API paths
    • Versioning
    • Simple JSON Response (Map or List)
    • Session
    • Cookies
    • Welcome message
  • Endpoint
    • Endpoint name is based on controller's name by default e.g ProductsController produces /web/api/v2/products
    • Endpoint name can be overridden by using #Name tag e.g /web/api/v2/product
    • Custom version name using #Version tag e.g v2, live, demo, dev, staging
    • Description in documentation is set using #Desc tag (in Web API v1, it was set by #Desc1, #Desc2 or Literals that was very confusing)
    • API endpoint can be hidden using #Hide tag
  • Clients
Tutorials:
  1. Getting Started
  2. Download File Example
  3. Vue 3 CRUD Example
Live:
Learn:

Version History:
  • (new) WebApiUtils v2.08
  • (new) MiniORMUtils v1.13
  • (new) WebAPIController v1.07
  • (change) Use DbFile instead of DbName for SQLite in config.ini
  • (change) Move code from ConfigureDatabase sub to Initialize sub in DatabaseConfiguration class
  • (remove) Delete build configurations and code for Firebird, PostgreSQL and MS SQL
  • (new) WebApiUtils v2.07
  • (new) MiniORMUtils v1.11
  • (new) WebAPIController v1.06
  • (new) Main module
    • SHOW_API_ICON to control API icon visible on frontend top navbar
  • (new) ServerConfiguration class
    • setEnableHelp to disable API Documentation and icon in frontend top navbar
    • setSimpleResponse replaces 3 old variables
  • (change) ServerConfiguration class
    • rename some variables
    • change some Public subs to Private
  • (change) Some index.html files deleted
  • (new) WebApiUtils v2.06
  • (new) MiniORMUtils v1.10
  • (new) WebAPIController v1.05
  • (new) Main module is cleaner
  • (new) Added ServerConfiguration class
  • (new) Added DatabaseConfiguration class
  • (new) Added empty index.html files into assets folders
  • (new) FindController - case insensitive and wildcard search
  • (change) Table tbl_category renamed to tbl_categories
  • (change) ServerConfiguration Update sub renamed to Finalize
  • (change) better handling of default values in config.ini
  • (fix) bug in v2.06 beta 1, no database set by default in config.ini
  • (fix) bug in v2.06 beta 2, PostProduct line#233 in ProductsController causing all data inserted as Timestamp
  • (new) MinimaList API Server (version 2.05) as a separate template
  • (new) MiniORMUtils (version 1.07)
  • (new) MinimaListUtils (version 1.02)
  • (new) WebApiController (version 1.04)
  • (new) Use a single public variable SimpleResponse instead of 3 different public variables.
  • (update) HelpHandler - JavaScript files for search is no longer generated during compilation.
    The files are now keep inside assets/js folder instead. SimpleResponse and standard JSON are supported.
    Thanks to projects Ticketing Support System and Shao.
  • (update) Some JavaScript files have been renamed using period instead of dash.
  • (new) Web Front-end with CRUD demo (similar to version 1)
  • (new) B4X Web API Client (version 1.05) supported (note: set ConfigureResponse(False))
  • (new) WebApiUtils.b4xlib (version 2.04) (Utility and WebUtils modules merged)
  • (new) WebAPIController (version 1.03) is backed
  • (new) MinimaListUtils.b4xlib (version 1.00)
  • (new) Database support (tested with SQLite and MySQL)
  • (new) Build Standalone Package supported
  • (new) Additional library for jdbc connector is set by selecting a Build configuration during Debug
  • (new) ConfigureServer subs are now enabled by passing Boolean value instead of commenting the line
  • (new) Utilize B4J v10.00 Code Snippets feature
  • (new) DatabaseConnector (for SQLite, MySQL, SQL Server, Firebird, PostgreSQL, DBF)
  • (new) SeedData for MinimaList
  • (new) ConfigureResponse added SimpleResponseDataKey (when SimpleResponseFormat = "Map", default is data)
  • (new) JavaScript files for supporting SimpleResponseFormat
  • (new) ReturnApiResponse sub added
  • (fixed) ConfigureServer subs order changed
  • (fixed) ConfigurePort
  • (fixed) ConfigurePaths
  • (fixed) ConfigureElements list element indices during Debug
  • (fixed) ConfigureHandlers
  • (fixed) ConfigureResponse added SimpleResponseFormat = "Auto"
  • (removed) Timezone setting
  • (removed) DataController class
  • (removed) ReturnSimpleHttpResponse
  • (removed) MinimaListController (version 1.05) -> succeeded by WebAPIController
  • (updated) MinimaList subs are renamed
  • (updated) ReturnHttpResponse
  • (updated) All Controllers
  • (updated) All Handlers
  • (other) Clean up unused code and many other bugs fixes

Code example:
B4X:
Private Sub GetCategory (id As Long)
    ' #Version = v2
    ' #Desc = Read one Category by id
    ' #Elements = [":id"]

    DB.Table = "tbl_category"
    DB.Find(id)
    If DB.Found Then
        HRM.ResponseCode = 200
        HRM.ResponseObject = DB.First
    Else
        HRM.ResponseCode = 404
        HRM.ResponseError = "Category not found"
    End If
    DB.Close
    ReturnApiResponse
End Sub

This project has been tested many many times. Please report bugs if you found any
Post your question in a new thread.




Special thanks to donors of this project:
  1. @yaqoob
  2. @Czampo
 

Attachments

  • Web API Server (2.08).b4xtemplate
    441.2 KB · Views: 112
  • WebApiUtils.b4xlib
    9.4 KB · Views: 97
  • MiniORMUtils.b4xlib
    14.3 KB · Views: 102
  • WebApiController.b4xlib
    4.5 KB · Views: 48
Last edited:

aeric

Expert
Licensed User
Longtime User

Optional Modules​

  1. JSON Web Tokens
  2. Encryption

Optional Filters​

  1. BasicAuth
  2. JWTAuth

Updates: These modules have been deprecated. They are no longer working without modifications. If you want to work with these modules, please post to a new thread.
 

Attachments

  • JSONWebToken.bas
    4.6 KB · Views: 271
  • Encryption.bas
    1.6 KB · Views: 271
  • BasicAuthFilter.bas
    1.8 KB · Views: 255
  • JWTAuthFilter.bas
    1.4 KB · Views: 287
Last edited:

aeric

Expert
Licensed User
Longtime User
A small issue i.e. I forgot to update the Client ID.

Change line #96 in Main module to following:
B4X:
AUTH.CLIENT_ID = "web-202301151435-web-api-200.computerise.net"        ' username

Updates: The issue is now fixed in GitHub repo.
 
Last edited:

aeric

Expert
Licensed User
Longtime User
I may be wrong.
Does anyone really use my Web API Template?
I have the feeling not much interest on this project. I don't see any discussion or question on the issue in this project. I feel it just a pet project that I am the only one feel good about it and provide no valuable real life use cases. 🥲

But...
The fact is I am powering my production apps with this template.
 

Davisbc

Member
Licensed User
I am try to use it as the foundation for a data collection app. The mobile collects data and then syncs with the web api. I started using the v1 template. It worked, but I found it difficult to try and convert to my database. I decided to start over and then found the v2 beta. I had to comment the auth code to make it work. from your comments, that part is a work in progress. My use case is an api pack end to update a database and maintain a transaction log. I have to believe it’s a common use case. All the best.
 

aeric

Expert
Licensed User
Longtime User
I believe v1 and v2 beta 3 have provided the foundation to build any Web API server. What I am adding are just on the implementation of the front end.

The security part in v2 can be ignored as I am actually using Session for log in user instead of JWT token.

Please ask any question if you found any issue.
I know there are some known issues and waiting someone to report.
One of them are usage of comment tags in HelpHandler but it is not really a big issue and won't affect the overall system.

When no one is reporting then I get the feeling no one is using it.
 

Davisbc

Member
Licensed User
Thanks. I have a bit more cleanup of the b4a before I plan on working the backend again. That’s why I was asking when you planned on updating the template so I would start with a clean code. Cheers
 
Top