Italian Risposta dal server Http

Lello1964

Well-Known Member
Licensed User
Longtime User
Il tempo può essere anche maggiore di un minuto, se l'utente è nel Setup del rendiresto, non può erogare, ma questo lo potrei gestire io con un timeout, diciamo che passano al massimo due secondi.
 

LucaMs

Expert
Licensed User
Longtime User
Prova così:

B4X:
Sub Server_HandleRequest (Request As ServletRequest, Response As ServletResponse)
    Try
        If Request.Method = "POST" Then 'User pressed on the Send button
            Log("Incasso HTTP in corso ")
            CallSubDelayed2(Me, "GestisciRichiesta", Response)
        Else
            Log("Non è un POST")
        End If
    Catch
        Response.Status = 500
        Log("Error serving request: " & LastException)
        Response.SendString("Errore server " & LastException )
    End Try

End Sub

Private Sub GestisciRichiesta(Response As ServletResponse)
    Wait For RispostaHttp (Risposta As String)
    Response.SendString(Risposta)
    Log("Risposta" & Risposta)
End Sub

(Non ho provato perché ora non ho attivi due Android - se magari il client, solo per prova, lo fai con b4j... è più comodo)
 

LucaMs

Expert
Licensed User
Longtime User
primo tempo 0-0 squalliduccio. Scrivo qui, perdo i primi 15 minuti del secondo: 1-1 :mad: 😄
 

Star-Dust

Expert
Licensed User
Il tempo può essere anche maggiore di un minuto, se l'utente è nel Setup del rendiresto, non può erogare, ma questo lo potrei gestire io con un timeout, diciamo che passano al massimo due secondi.
Ok. Ci studio un po'.
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Luca, non ho provato la tua soluzione, ora lo faccio,

Ma ho trovato anche io una soluzione :

B4X:
Sub Server_HandleRequest (Request As ServletRequest, Response As ServletResponse)
    Try
        If Request.Method = "POST" Then 'User pressed on the Send button
            Log("Incasso HTTP in corso ")
            FlgAttesa=True
            Dim Risposta As String ="ok"
            Attesa
        '    wait for RispostaHttp (Risposta As String)
            
            ' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> resta in attesa ma chiude comunque la richiesta, non arriva mai quì
            
            Response.SendString(Risposta)
            Log("Risposta" & Risposta)
        Else
            Log("Non è un POST")
        End If
    Catch
        Response.Status = 500
        Log("Error serving request: " & LastException)
        Response.SendString("Errore server " & LastException )
    End Try
End Sub

Sub Service_Destroy
    server.Stop
    Service.StopForeground(1)
End Sub

Sub Attesa As ResumableSub
    Do While 1=1
        DoEvents
        If FlgAttesa=False Then
            Return True
        End If

    Loop
    Return True
End Sub

B4X:
Sub Button1_Click
    ServerHttp.FlgAttesa=False   
End Sub
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Prova così:

B4X:
Sub Server_HandleRequest (Request As ServletRequest, Response As ServletResponse)
    Try
        If Request.Method = "POST" Then 'User pressed on the Send button
            Log("Incasso HTTP in corso ")
            CallSubDelayed2(Me, "GestisciRichiesta", Response)
        Else
            Log("Non è un POST")
        End If
    Catch
        Response.Status = 500
        Log("Error serving request: " & LastException)
        Response.SendString("Errore server " & LastException )
    End Try

End Sub

Private Sub GestisciRichiesta(Response As ServletResponse)
    Wait For RispostaHttp (Risposta As String)
    Response.SendString(Risposta)
    Log("Risposta" & Risposta)
End Sub

(Non ho provato perché ora non ho attivi due Android - se magari il client, solo per prova, lo fai con b4j... è più comodo)
Non funziona, si comporta allo stesso modo, esce, poi esegue la callsub.
 

Star-Dust

Expert
Licensed User
Con DoEvents funzionerà ma è sbagliato che dichiari la sub ResumableSub
B4X:
Sub Attesa 
    Do While FlgAttesa
        DoEvents
    Loop
End Sub
 

Star-Dust

Expert
Licensed User
Si, ho seguito il tuo suggeriemento, ma non è deprecated ??
È deprecato, infatti volevo trovare una soluzione migliore.
Dicevo di usare DoEvents per fare una prova. Anche perché potrebbe andare in stallo con il DoEvents
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Con DoEvents funzionerà ma è sbagliato che dichiari la sub ResumableSub
B4X:
Sub Attesa
    Do While FlgAttesa
        DoEvents
    Loop
End Sub
Funziona perfettamente, grazie.

Ma che problemi mi darà ? visto che Erel dice che è deprecato ?
 

Star-Dust

Expert
Licensed User
Funziona perfettamente, grazie.

Ma che problemi mi darà ? visto che Erel dice che è deprecato ?
Può andare in stallo e se c'è una modifica nelle viste potrebbe andare in crash.
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Troppo pericoloso, il sistema lavora con servizi e timer per gestire gli accettatori che se non ricevono il poll entro 200ms si bloccano.
 

Star-Dust

Expert
Licensed User
Erel dice :

There is no server side implementation of WebSockets for B4A.

I recommend you to use MQTT instead.

Con xHttpServer adesso c'è il Websocket anche su b4a e b4i
 
Top