leandro.legnaro
Member
Hello,
I developed a code to to send and receive JSON data to an API. The original code send and receive an JSON and is working fine.
Now I want to do the same code to send and receiving bytes to reduce the traffic. I could do the code for POST bytes, below the original code for "POST JSON" and new code for "POST BYTES":
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
To reduce the traffic I converted the code to :
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
In the server side I have an API developed in Python :
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Both codes is working fine, but now I need do the same thing not for "POST" but for the "GET"
I wrote this code :
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
In the server side for GET I have:
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
The server can answer a "byte" data, but I don´t know to transform this byte in string. In B4A I got this error in the line
ReceivedData = Compressor.DecompressBytes(Job.GetString.GetBytes("UTF8"), "zlib")
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Probably I doing something wrong handling the server response, but I dont know how can I transform the reponse from bytes to string.
			
			I developed a code to to send and receive JSON data to an API. The original code send and receive an JSON and is working fine.
Now I want to do the same code to send and receiving bytes to reduce the traffic. I could do the code for POST bytes, below the original code for "POST JSON" and new code for "POST BYTES":
			
				Original Post:
			
		
		
		    JsonData=GenerateJSON("TbColetaProdutoLocal")
    Http_TbColetaProdutoLocal.Initialize("inserecoletaprodutolocal", Me)
    Http_TbColetaProdutoLocal.username = GlobalModule.username
    Http_TbColetaProdutoLocal.password = GlobalModule.password
    Http_TbColetaProdutoLocal.PostString(host & "/inserecoletaprodutolocal", JsonData)
    Http_TbColetaProdutoLocal.GetRequest.SetContentType("application/json")
    Http_TbColetaProdutoLocal.GetRequest.Timeout = 2400000
    wait for (Http_TbColetaProdutoLocal) JobDone(Http_TbColetaProdutoLocal As HttpJob)
    If Http_TbColetaProdutoLocal.Success Then
        If Not(Main.dbSQL.IsInitialized) Then
            Main.dbSQL.Initialize(File.DirInternal, "cra.db", False)
        End If
        Main.dbSQL.ExecNonQuery("update TbColetaprodutoLocal set enviado=1 where enviado=0")
        Main.dbSQL.Close
      
        Log("Dados de ColetaProdutoLocal Enviados")
      
    Else
        ToastMessageShow("Erro ao enviar dados de ColetaProdutoLocal", True)
    End If
    Http_TbColetaProdutoLocal.release
	To reduce the traffic I converted the code to :
			
				New Code using bytes compressed:
			
		
		
		    JsonData=GenerateJSON("TbColetaProdutoLocal")
  
    SendData = ByteConvert.StringToBytes(JsonData, "UTF-8")
    Http_TbColetaProdutoLocal.Initialize("inserecoletaprodutolocal", Me)
    Http_TbColetaProdutoLocal.username = GlobalModule.username
    Http_TbColetaProdutoLocal.password = GlobalModule.password
    Http_TbColetaProdutoLocal.PostBytes(host & "/inserecoletaprodutolocal_v2", Compressor.CompressBytes(SendData, "zlib"))
    Http_TbColetaProdutoLocal.GetRequest.SetContentType("application/octet-stream") '
    Http_TbColetaProdutoLocal.GetRequest.Timeout = 480000
    wait for (Http_TbColetaProdutoLocal) JobDone(Http_TbColetaProdutoLocal As HttpJob)
    If Http_TbColetaProdutoLocal.Success Then
        If Not(Main.dbSQL.IsInitialized) Then
            Main.dbSQL.Initialize(File.DirInternal, "cra.db", False)
        End If
        Main.dbSQL.ExecNonQuery("update TbColetaprodutoLocal set enviado=1 where enviado=0")
        Main.dbSQL.Close
      
        Log("Dados de ColetaProdutoLocal Enviados")
      
    Else
        Log("ERRO ao enviar ColetaProdutoLocal")
        ToastMessageShow("Erro ao enviar dados de ColetaProdutoLocal", True)
    End If
    Http_TbColetaProdutoLocal.release
	In the server side I have an API developed in Python :
			
				Server Side:
			
		
		
		class inserecoletaprodutolocal_v2(Resource):
    @auth.login_required
    def post(self):
        conn = db_connect()
        json_bytes=zlib.decompress( request.data )
        json_str = json_bytes.decode('utf-8')
        data = json.loads(json_str)
        print json_str
        conn.execute("exec cra_insertrecord 'CRA_TbColetaProdutoLocal','" + json_str + "'")
      
        conn.commit()
        conn.close()
        return {'status':'success'}
	Both codes is working fine, but now I need do the same thing not for "POST" but for the "GET"
I wrote this code :
			
				Request:
			
		
		
		    Http_LojaProdutoModulo.Initialize("LojaProdutoModulo", Me)
    Http_LojaProdutoModulo.Download(host & "/lojaprodutomodulo_v2/" & idUsuario)
    Http_LojaProdutoModulo.username = GlobalModule.username
    Http_LojaProdutoModulo.password = GlobalModule.password
    Http_LojaProdutoModulo.GetRequest.Timeout = 480000
	
			
				JobDone:
			
		
		
		Sub JobDone(Job As HttpJob)
ProgressDialogHide
Dim parser As JSONParser
    If Job.Success Then     
            Dim ByteConvert As ByteConverter
            Dim Compressor As CompressedStreams
            Dim ReceivedData() As Byte
          
            Dim str As String
          
            ReceivedData = Compressor.DecompressBytes(Job.GetString.GetBytes("UTF8"), "zlib")
          
            str=ByteConvert.StringFromBytes(ReceivedData, "UTF-8")
      
            parser.Initialize(str)
          
            Dim root As List = parser.NextArray
            For Each colroot As Map In root
                Dim cdLoja As Int = colroot.Get("cdLoja")
                Dim cdProduto As Int = colroot.Get("cdProduto")
                Dim cdOnda As Int = colroot.Get("cdOnda")
                Dim nuMod As String = colroot.Get("nuMod")
                Dim packvirtual As Int = colroot.Get("packvirtual")
                Main.dbSQL.ExecNonQuery2("INSERT INTO TbLojaProdutoModulo (cdLoja, cdProduto, cdOnda, nuMod, packvirtual) values (?, ?, ?, ?, ?)", Array As Object(cdLoja, cdProduto, cdOnda,  nuMod, packvirtual ))
            Next
    end if
	In the server side for GET I have:
			
				Server Side ( GET):
			
		
		
		class LojaProdutoModulo_v3(Resource):
    @auth.login_required
    def get(self, cod_usuario):
        conn = db_connect()
        query = conn.execute("select distinct top 10 tLPM.cdLoja, tLPM.cdProduto, tLPM.cdOnda, dbo.PMC_ModulosProduto(nuModulo) as nuMod, case when isNull(tLMP10.cdOnda, 0)=0 then 0 else 1 end as packvirtual from tbLojaProdutoModulo tLPM with (Nolock) inner join tbUsuarioLoja tUL with (Nolock) on tUL.cdLoja = tLPM.cdLoja and tUL.cdOnda = tLPM.cdOnda inner join tbProduto tP with (Nolock) on tLPM.cdProduto = tP.cdProduto left join tbLojaProdutoModulo_10 tLMP10 with (Nolock) on tLMP10.cdloja=tLPM.cdLoja and tLMP10.cdProduto=tLPM.cdProduto and tLMP10.cdOnda=tLPM.cdOnda where tUL.cdUsuario = %d order by tLPM.cdLoja, tLPM.cdOnda, tLPM.cdProduto" %int(cod_usuario))
        rows = conn.fetchall()
        rowarray_list = []
        for row in rows:
            t = (row[0], row[1], row[2], row[3], row[4])
            rowarray_list.append(t)
          
        j = json.dumps(rowarray_list) + "\n"
        json_bytes = j.encode('utf-8')
        content = zlib.compress(json_bytes, 5)
        response = make_response(content)
        response.headers['Content-length'] = len(content)
        response.headers['Content-Encoding'] = 'gzip'
        return response
	The server can answer a "byte" data, but I don´t know to transform this byte in string. In B4A I got this error in the line
ReceivedData = Compressor.DecompressBytes(Job.GetString.GetBytes("UTF8"), "zlib")
			
				error:
			
		
		
		Error occurred on line: 237 (HttpJob)
java.util.zip.ZipException: incorrect header check
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:183)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at anywheresoftware.b4a.objects.streams.File.Copy2(File.java:361)
    at anywheresoftware.b4a.randomaccessfile.CompressedStreams.DecompressBytes(CompressedStreams.java:152)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:348)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.BA$2.run(BA.java:387)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:241)
    at android.app.ActivityThread.main(ActivityThread.java:7604)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
	Probably I doing something wrong handling the server response, but I dont know how can I transform the reponse from bytes to string.
			
				Last edited: