Spanish Httpjob no esta trabajando o no recibe respuestas

Hola de nuevo, no se porque el anterior post no aparece. Tengo este codigo en B4A que debería devolverme una respuesta desde una API pero los _ResponseSuccess y _ResponseError no se disparan. Que está sucediendo??? vi en otro post que el Httpjob no estaba trabajando con normalidad...

@Erel, @asales saben que estaría sucediendo?


Ejemplo:
Sub Button1_Click
    GetLiveMatches
End Sub

Sub GetLiveMatches
    Dim job As HttpJob
    job.Initialize("LiveMatchesJob", Me)
    job.Download("https://v3.football.api-sports.io/fixtures?live=all")
    job.GetRequest.SetHeader("x-rapidapi-host", "v3.football.api-sports.io")
    job.GetRequest.SetHeader("x-rapidapi-key", "672239e740516f0166befb45b11da634")
    Log("Petición de partidos iniciada...")
    ' Muestra un mensaje de "Cargando..." en la UI
    ' Por ejemplo:
    lblStatus.Text = "Cargando partidos..."

End Sub

' Este sub se ejecutará cuando la petición termine
Sub LiveMatchesJob_ResponseSuccess (job As HttpJob)
    Log("--> SUB LIVE_MATCHES_JOB_RESPONSESUCCESS FUE LLAMADA")
    ' Verifica si la petición fue exitosa
    If job.Success Then
        Log("Respuesta de la API recibida")
        
        Dim jsonResponse As String
        jsonResponse = job.GetString

        ' Ahora necesitas parsear este JSON
        ParseMatches(jsonResponse)
    Else
        ' Maneja el caso de error si la petición no fue exitosa
        Log("Error al obtener datos: " & job.ErrorMessage)
    End If

    ' Libera los recursos del objeto Job
    job.Release
End Sub

' Este sub se ejecutará si hay un error en la petición
'Sub LiveMatchesJob_ResponseError (joba As HttpJob, Reason As String, StatusCode As Int)
Sub LiveMatchesJob_ResponseError (job As HttpJob, Reason As String, StatusCode As Int)
    Log("Error en la petición: " & Reason)
    lblStatus.Text = "Error al cargar los datos: " & Reason
    job.Release
End Sub

Sub ParseMatches(jsonString As String)
    ' Limpia cualquier vista anterior en la interfaz de usuario
    PanelScrollView.Panel.RemoveAllViews
    
    Dim parser As JSONParser
    parser.Initialize(jsonString)
    
    Dim jsonRoot As Map
    jsonRoot = parser.NextValue

    If jsonRoot.ContainsKey("response") Then
        Dim responseList As List
        responseList = jsonRoot.Get("response")
        
        If responseList.Size > 0 Then
            For Each matchMap As Map In responseList
                ' Extrae los datos de cada partido
                Dim fixtureMap As Map = matchMap.Get("fixture")
                Dim teamsMap As Map = matchMap.Get("teams")
                Dim goalsMap As Map = matchMap.Get("goals")
                Dim leagueMap As Map = matchMap.Get("league")
                
                Dim homeTeamMap As Map = teamsMap.Get("home")
                Dim awayTeamMap As Map = teamsMap.Get("away")
                
                Dim homeGoals As Int = goalsMap.Get("home")
                Dim awayGoals As Int = goalsMap.Get("away")
                Dim leagueName As String = leagueMap.Get("name")
                
                ' Aquí llamarías a un sub para crear las vistas
                CreateMatchView(homeTeamMap, awayTeamMap, homeGoals, awayGoals, leagueName)
            Next
        Else
            Log("No hay partidos, muestra un mensaje")
            lblStatus.Text = "No hay partidos en vivo en este momento."
        End If
    Else
        ' La clave "response" no existe en el JSON. La API no devolvió datos.
        Log("La respuesta de la API no contiene la clave 'response'.")
        lblStatus.Text = "No se pudieron obtener los datos de la API."
    End If
End Sub
 

TILogistic

Expert
Licensed User
Longtime User
ver:
B4X:
Private Sub Button1_Click
    Wait For (GetURL) Complete (DataResult As String)
    If DataResult.Length = 0 Then
        'mensaje si el resultado no retorno datos
        Return
    End If
   
    '-- aqui debe hacer el parse del json
    Log(DataResult)
   
End Sub

Public Sub GetURL As ResumableSub
    Dim Result As String
    Dim j As HttpJob
    j.Initialize("", Me)
    j.Download( "https://v3.football.api-sports.io/fixtures?live=all")
    j.GetRequest.SetHeader("x-rapidapi-host", "v3.football.api-sports.io")
    j.GetRequest.SetHeader("x-rapidapi-key", "672239e740516f0166befb45b11da634")
    j.GetRequest.Timeout = 60 * DateTime.TicksPerSecond
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.Response.StatusCode)
        Result = j.GetString
    Else
        'error
        Log(j.Response.StatusCode)
        Log(j.Response.ErrorResponse)
    End If
    j.Release
    Return Result
End Sub

Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
(Http client initialized with accept all option.)
200
{"get":"fixtures","parameters":{"live":"all"},"errors":[],"results":1,"paging":{"current":1,"total":1},"response":[{"fixture":{"id":1357915,"referee":null,"timezone":"UTC","date":"2025-08-14T08:00:00+00:00","timestamp":1755158400,"periods":{"first":1755158400,"second":null},"venue":{"id":null,"name":"Mungyeong Public Stadium","city":"Mungyeong"},"status":{"long":"First Half","short":"1H","elapsed":9,"extra":null}},"league":{"id":660,"name":"WK-League","country":"South-Korea","logo":"https:\/\/media.api-sports.io\/football\/leagues\/660.png","flag":"https:\/\/media.api-sports.io\/flags\/kr.svg","season":2025,"round":"Regular Season - 3","standings":true},"teams":{"home":{"id":14372,"name":"Boeun Sangmu","logo":"https:\/\/media.api-sports.io\/football\/teams\/14372.png","winner":false},"away":{"id":14378,"name":"Seoul","logo":"https:\/\/media.api-sports.io\/football\/teams\/14378.png","winner":true}},"goals":{"home":0,"away":1},"score":{"halftime":{"home":0,"away":1},"fulltime":{"home":null,"away":null},"extratime":{"home":null,"away":null},"penalty":{"home":null,"away":null}},"events":[{"time":{"elapsed":3,"extra":null},"team":{"id":14378,"name":"Seoul","logo":"https:\/\/media.api-sports.io\/football\/teams\/14378.png"},"player":{"id":null,"name":"Kim Min-Ji"},"assist":{"id":null,"name":null},"type":"Goal","detail":"Normal Goal","comments":null}]}]}

ctrl + B (agregar condicionales HU2_ACCEPTALL)
1755159600100.png

 
Last edited:

josejad

Expert
Licensed User
Longtime User
no se porque el anterior post no aparece.
Hola:

Al no ser un usuario registrado, tus post no aparecen hasta que el administrador los apruebe. A veces puede tardar algo más. Puedes ser usuario registrado comprando B4i o haciendo alguna donación (de cualquier cantidad) a B4X.

Por otro lado, no nombres a usuarios concretos en principio para solicitar ayuda "personalizada" de los mismos, es un foro y debe dirigirse en general a todo el mundo. (Erel suele pedir que no se haga esto)

Como verás en los ejemplos de TILogistic, no debe usarse el evento _ResponseSuccess, la forma correcta es con Wait For

 
ver:
B4X:
Private Sub Button1_Click
    Wait For (GetURL) Complete (DataResult As String)
    If DataResult.Length = 0 Then
        'mensaje si el resultado no retorno datos
        Return
    End If
  
    '-- aqui debe hacer el parse del json
    Log(DataResult)
  
End Sub

Public Sub GetURL As ResumableSub
    Dim Result As String
    Dim j As HttpJob
    j.Initialize("", Me)
    j.Download( "https://v3.football.api-sports.io/fixtures?live=all")
    j.GetRequest.SetHeader("x-rapidapi-host", "v3.football.api-sports.io")
    j.GetRequest.SetHeader("x-rapidapi-key", "672239e740516f0166befb45b11da634")
    j.GetRequest.Timeout = 60 * DateTime.TicksPerSecond
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.Response.StatusCode)
        Result = j.GetString
    Else
        'error
        Log(j.Response.StatusCode)
        Log(j.Response.ErrorResponse)
    End If
    j.Release
    Return Result
End Sub



ctrl + B (agregar condicionales HU2_ACCEPTALL)
View attachment 166029
Muchas gracias @TILogistic por tu respuesta oportuna.
 
Hola:

Al no ser un usuario registrado, tus post no aparecen hasta que el administrador los apruebe. A veces puede tardar algo más. Puedes ser usuario registrado comprando B4i o haciendo alguna donación (de cualquier cantidad) a B4X.

Por otro lado, no nombres a usuarios concretos en principio para solicitar ayuda "personalizada" de los mismos, es un foro y debe dirigirse en general a todo el mundo. (Erel suele pedir que no se haga esto)

Como verás en los ejemplos de TILogistic, no debe usarse el evento _ResponseSuccess, la forma correcta es con Wait For

Ayer me di cuenta de que debo esperar a que me aprueben los post y mensajes. Trataré de no referenciar a usuarios en concreto. Muchas gracias @josejad
 
Top