Spanish error 500 consumiendo web service post

Ivan Fernando Paz

Member
Licensed User
Longtime User
Hola a todos
He esctrito una pequeña aplicacion usando b4j la cual consume un servicio web.
El ws recibe una cadena json y retorna una respuesta
Mi aplicacion generalmente funciona bien y de vez en cuando genera el siguiente error:

"ResponseError. Reason: Internal Server Error, Response: <!-- Notice: Undefined variable: datos (500 Internal Server Error) -->"
<!-- Notice: Undefined variable: datos (500 Internal Server Error) -->

Lo curioso es que si uso postman con la misma cadena json recibo respuesta correcta, tambien he probado consumiendo el ws con una app .net y funciona bien con la misma cadena json

Despues de analizar la cadena json que genera el error descubrí que se debe a las apariciones del simbolo %, al quitarlo mi app funciona normal.
Debo tratar el simbolo % de manera especial?
La cadena json tiene codificacion utf8

Que puede estar pasando?

He visto otros post con el error 500 pero ninguno me arroja luz en mi problema.

Gracias por su colaboracion!

Uso b4j version 9.10 sobre windows 10 pro

ws:
    Dim bExito As Boolean=False
    Dim job1 As HttpJob
    job1.Initialize("", Me)
  
    If ParamJaniva.besProduccion Then
        job1.PostString(sUrlWS & "/apiRest/enviarFactura", "jsonDocumento=" & json_doc )
     
    Else
        job1.PostString(sUrlWS & ":8087/apiRest/enviarFactura", "jsonDocumento=" & json_doc & "&idTest=" & sIdTest )
    End If
    
   
    job1.GetRequest.SetContentType("application/json")
    'job1.GetRequest.SetContentType("plain/text")
    job1.GetRequest.SetContentType("application/form-data")
    job1.GetRequest.SetHeader("Authorization", "Bearer " &  Token)
    
    Wait For (job1) JobDone(j As HttpJob)
    If j.Success Then
 

Attachments

  • json_simbolo_porc.zip
    4.3 KB · Views: 63

Omar Parra A.

Expert
Licensed User
Longtime User
??
B4X:
    Dim d As String = "Tic tac Naranja+tic tac fruts rojos 2 x 12 16%desct"
    Dim su As StringUtils
    Log(su.EncodeUrl(d, "UTF8"))
    Log(su.DecodeUrl(su.EncodeUrl(d, "UTF8"), "UTF8"))
log:
Tic+tac+Naranja%2Btic+tac+fruts+rojos+2+x+12+16%25desct
Tic tac Naranja+tic tac fruts rojos 2 x 12 16%desct
 

Ivan Fernando Paz

Member
Licensed User
Longtime User
Gracias por tu rápida respuesta.
Apliqué el método EncodeUrl a toda la cadena json y me genera el mismo error.

Sigo sin entender porque esta cadena json funciona perfectamente en postman?
Al aplicar los validadores en linea json a la cadena sale correcta, el simbolo % que yo sepa no es reservado o especial, cierto?
 

Omar Parra A.

Expert
Licensed User
Longtime User
Lo curioso es que si uso postman con la misma cadena json recibo respuesta correcta

Estimado cuando pruebas con postman retorna el encabezado, con esto sabes como llamar las api:

ejemplo:
1627011745332.png
 

Ivan Fernando Paz

Member
Licensed User
Longtime User
Hecha la prueba pero genera el mismo error.
La cosa va por el tratamiento de este simbolo, pero no se como tratarlo.
Gracias

El simbolo % SI está "reservado"

Prueba

B4X:
job1.GetRequest.SetContentType("application/json;charset=utf-8")
Estimado cuando pruebas con postman retorna el encabezado, con esto sabes como llamar las api:

ejemplo:
View attachment 116856


En postman esa clave aparece asi: (deshabilitado)
application/x-www-form-urlencoded

1627045438599.png



Al aplicarlo sigue generando el error
 

Attachments

  • 1627044157560.png
    1627044157560.png
    155.7 KB · Views: 68
Last edited:

Omar Parra A.

Expert
Licensed User
Longtime User
Estimado, la documentación indica que debe enviar con CURL
curl --location -g --request POST '{{url}}/apiRest/enviarFactura' \
--header 'Authorization: Bearer {{token}}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'jsonDocumento={...}'

Con b4X debe enviar header y data-urlencode asi:
B4X:
    Dim bExito As Boolean=False
    Dim j As HttpJob
    j.Initialize("", Me)

    If ParamJaniva.besProduccion Then
        Dim Parameters As String = Array As String ("jsonDocumento", json_doc)
        j.PostString(sUrlWS & "/apiRest/enviarFactura", URLEncodeParameter(Parameters)) '--> data-urlencode 'jsonDocumento={...}'

    Else
        Dim Parameters As String = Array As String ("jsonDocumento", json_doc, "idTest", sIdTest)
        j.PostString(sUrlWS & ":8087/apiRest/enviarFactura", URLEncodeParameter(Parameters))  '--> data-urlencode 'jsonDocumento={...}'
    End If

    j.GetRequest.SetHeader("Authorization", "Bearer " &  Token) '--> header 'Authorization: Bearer {{token}}'
    j.GetRequest.SetHeader("Content-Type", "application/x-www-form-urlencoded") '--> header 'Content-Type: application/x-www-form-urlencoded'
    Wait For (j) JobDone(j As HttpJob)

UN REGALO PARA USO EN EL FUTURO: rutina URLencode para los parámetros:
B4X:
Public Sub URLEncodeParameter(Parameters() As String) As String
    Dim sb As StringBuilder
    sb.Initialize
    If Parameters.Length = 0 Then sb.ToString
    Dim su As StringUtils
    For i = 0 To Parameters.Length - 1 Step 2
        If i > 0 Then sb.Append("&")
        sb.Append(su.EncodeUrl(Parameters(i), "UTF8")).Append("=")
        sb.Append(su.EncodeUrl(Parameters(i + 1), "UTF8"))
    Next
    Return sb.ToString
End Sub
 
Last edited:
Top