Share My Creation [Project Template] EndsMeet Server

Version: 1.01
This is a project template for EndsMeet server library.
It depends on EndsMeet, MiniHtml and WebApiUtils libraries.

GitHub: https://github.com/pyhoon/EndsMeet-Server

EndsMeet Server
 

Attachments

  • EndsMeet Server (1.01).b4xtemplate
    4.7 KB · Views: 44
Last edited:

aeric

Expert
Licensed User
Longtime User
Note
This example is not applicable for the latest library

A short tutorial to add a new api.

Modify to the following code.

HelloController:
Public Sub RouteApi
    Select Request.Method
        Case "GET"
            Dim RequestMap As Map = EndsMeetUtils.GetRequestElements(Request.RequestURI, Main.BaseElements)
            If RequestMap.ContainsKey("First") Then
                Dim Person As String = RequestMap.Get("First")
                GetGreet(Person)
            Else
                GetJSON
            End If
        Case Else
            Log("Unsupported method: " & Request.Method)
            EndsMeetUtils.ReturnMethodNotAllow(HRM, Response)
    End Select
End Sub

Private Sub GetGreet (Name As String)
    #region Documentation
    ' #Version = v1
    ' #Desc = Return greeting message
    #End region
    Model.ReturnGreetingApi(Name)
End Sub

HelloModel:
Public Sub ReturnGreetingApi (Person As String)
    Dim m1 As Map
    m1.Initialize
    m1.Put("greeting", $"Merry Xmas, ${Person}!"$)
    HRM.ResponseObject = m1
    EndsMeetUtils.ReturnHttpResponse(HRM, Response)
End Sub

IndexView:
Public Sub Render
    Dim strHtml As String = $"<center>
        <a href="${Main.ROOT_PATH}hello">Go to Hello page</a><br/>
        <p><a href="${Main.ROOT_PATH}api/v1/hello">Get Hello API</a></p>
        <p><a href="${Main.ROOT_PATH}api/v1/hello/B4X">Get Greeting API</a></p>
        </center>"$
    EndsMeetUtils.ReturnHtml(strHtml, Response)
End Sub

Note: This example doesn't check for api version.

1702903113058.png
 
Last edited:

aeric

Expert
Licensed User
Longtime User
Note
This example is not applicable for the latest library

Another example using HTMX.

IndexView:
Sub Class_Globals
    Private Response As ServletResponse
End Sub

Public Sub Initialize (req As ServletRequest, resp As ServletResponse)
    Response = resp
End Sub

Public Sub Render
    Dim strHtml As String = $"<center>   
        <button hx-put="/demo/messages" style="padding: 10px">
            Put To Messages
        </button>
        <p>
        <input type="text" name="q"
        hx-get="/demo/trigger_delay"
        hx-trigger="keyup changed delay:500ms"
        hx-target="#search-results"
        placeholder="Search...">
        <div id="search-results" style="margin-top: 60px">No result</div>
        </p>
        </center>
        
        <script src="https://unpkg.com/[email protected]" integrity="sha384-wS5l5IKJBvK6sPTKa2WZ1js3d947pvWXbPJ1OmWfEuxLgeHcEbjUUA5i9V5ZkpCw" crossorigin="anonymous"></script>
        "$
    EndsMeetUtils.ReturnHtml(strHtml, Response)
End Sub

WebHandler:
Sub Class_Globals
    Private Request As ServletRequest
    Private Response As ServletResponse
End Sub

Public Sub Initialize

End Sub

Sub Handle (req As ServletRequest, resp As ServletResponse)
    Request = req
    Response = resp
    ProcessRequest
End Sub

Private Sub ProcessRequest
    Log($"[${Request.Method}] ${Request.RequestURI}"$)   
    If EndsMeetUtils.isWebRequest(Request.RequestURI, Main.BaseElements) = False Then
        Response.SendError(400, "Bad Request")
        Return
    End If
    
    Dim RequestMap As Map = EndsMeetUtils.GetRequestElements(Request.RequestURI, Main.BaseElements)
    Dim Path As String = RequestMap.Get("Path")
    If Path.EqualsIgnoreCase(Main.BaseElements.Path.Element) = False Then
        Response.SendError(400, "Bad Request")
        Return
    End If
    
    Select RequestMap.Size
        Case 1 ' root
            Log(RequestMap)
        Case 2 ' path (demo)
            Dim Index As IndexView
            Index.Initialize(Request, Response)
            Index.Render
            Return
        Case Else
            Dim Controller As String = RequestMap.Get("Controller")
            Select Controller
                Case "hello"
                    Dim Hello As HelloController
                    Hello.Initialize(Request, Response)
                    Hello.RouteWeb
                    Return
                Case "messages"
                    DateTime.DateFormat = "dd/MM/yyyy HH:mm:ssa"
                    Response.Write(DateTime.Date(DateTime.Now))
                    Return
                Case "trigger_delay"
                    Dim q As String = Request.GetParameter("q")
                    If q = "" Then
                        Response.Write("No result")
                    Else
                        Response.Write(q)
                    End If
                    Return
            End Select
    End Select
    Response.SendError(400, "Bad Request")
End Sub
 
Last edited:

aeric

Expert
Licensed User
Longtime User
Note
This message is not applicable for the latest library

EndsMeet v0.18 beta 3 updated.
Now only has a single BaseHandler.
 
Last edited:

aeric

Expert
Licensed User
Longtime User
Version 0.90
This is now a project template. Main module is now cleaner.
It depends on MiniHtml and WebApiUtils.

EndsMeet is now a separate library to create B4J server app.
 

aeric

Expert
Licensed User
Longtime User
If you are getting error with EndsMeet v0.93 or v0.96:
HttpsFilter - 16: Unknown member: sslport

Please update the code in HttpsFilter from app.sslPort to app.ssl.Port at line #16.

B4X:
'Https Filter class
Sub Class_Globals

End Sub

Public Sub Initialize
 
End Sub

'Return True to allow the request to proceed.
Public Sub Filter (req As ServletRequest, resp As ServletResponse) As Boolean
    If req.Secure Then
        Return True
    Else
        'Dim app As EndsMeet = Main.app
        resp.SendRedirect(req.FullRequestURI.Replace("http:", "https:") _
       .Replace(Main.app.Port, Main.app.ssl.Port))
        Return False
    End If
End Sub
 

aeric

Expert
Licensed User
Longtime User
Version 1.00

What's New
  1. Updated dependencies to EndsMeet v1.00
  2. Updated code example in Index.bas
  3. Added LibDownloader comment link
  4. Added libs.json file
 

aeric

Expert
Licensed User
Longtime User
Version 1.01

What's Changed
  1. Relink EndsMeet library (Filename without version number)
  2. Change app.Get to app.Post for /modal
  3. Update libs.json
 
Top