Android Tutorial HttpUtils2 - Web services are now even simpler

HttpUtils2 was replaced with OkHttpUtils2: https://www.b4x.com/android/forum/threads/okhttp-replaces-the-http-library.54723/
Both libraries are included in the IDE.


HttpUtils2 is a small framework that helps with communicating with web services (Http servers).

HttpUtils2 is an improved version of HttpUtils.

The advantages of HttpUtils2 over HttpUtils are:
  • Any number of jobs can run at the same time (each job is made of a single task)
  • Simpler to use
  • Simpler to modify
  • Supports credentials
  • GetString2 for encodings other than UTF8
  • Download2 encodes illegal parameters characters (like spaces)

HttpUtils2 requires Basic4android v2.00 or above.
It is made of two code modules: HttpUtils2Service and HttpJob (class module).
The two code modules are included in HttpUtils2 (attached project).
It depends on the following libraries: Http and StringUtils

How to use
- Dim a HttpJob object
- Initialize the Job and set the module that will handle the JobDone event.
The JobDone event is raised when a job completes.
The module can be an Activity, Service or class instance. You can use the Me keyword to reference the current module.
Note that CallSubDelayed is used to call the event.
- Call one of the following methods:
Download, Download2, PostString, PostBytes or PostFile. See HttpJob comments for more information.
- Handle the JobDone event and call Job.Release when done.
Note that the completion order may be different than the submission order.

To send credentials you should set Job.UserName and Job.Password fields before sending the request.

For example the following code sends three request. Two of the responses will be printed to the logs and the third will be set as the activity background:
B4X:
Sub Activity_Create(FirstTime As Boolean)
   Dim job1, job2, job3 As HttpJob
   job1.Initialize("Job1", Me)

   'Send a GET request
   job1.Download2("http://www.b4x.com/print.php", _
      Array As String("first key", "first value :)", "second key", "value 2"))

   'Send a POST request
   job2.Initialize("Job2", Me)
   job2.PostString("http://www.b4x.com/print.php", "first key=first value&key2=value2")

   'Send a GET request
   job3.Initialize("Job3", Me)
   job3.Download("http://www.b4x.com/forum/images/categories/android.png")
End Sub

Sub JobDone (Job As HttpJob)
   Log("JobName = " & Job.JobName & ", Success = " & Job.Success)
   If Job.Success = True Then
      Select Job.JobName
         Case "Job1", "Job2"
            'print the result to the logs
            Log(Job.GetString)
         Case "Job3"
            'show the downloaded image
            Activity.SetBackgroundImage(Job.GetBitmap)
      End Select
   Else
      Log("Error: " & Job.ErrorMessage)
      ToastMessageShow("Error: " & Job.ErrorMessage, True)
   End If
   Job.Release
End Sub

This example and an example of downloading several images from Flickr are attached:

flickr_viewer1.png


Starting from B4A v2.70, HttpUtils2 is included as a library in the IDE.

Relevant links

ImageDownloader - Service that makes it simple to efficiently download multiple images. Note that a simpler "FlickrViewer example" is available there.
DownloadService - Download files of any size with DownloadService. Includes progress monitoring and the ability to cancel a download.
 

Attachments

  • FlickrViewer.zip
    10.7 KB · Views: 8,976
  • HttpUtils2.zip
    8.5 KB · Views: 11,246
Last edited:

sule

Member
Licensed User
Longtime User
is there way in httputilis2 to set
("http.protocol.handle-redirects", False)
 

sule

Member
Licensed User
Longtime User
If you give more details maybe we can helpè you
B4X:
Sub Process_Globals
    Dim hc As HttpClient   
End Sub

Sub Globals
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        hc.Initialize("hc")
        hc.SetHttpParameter("http.protocol.handle-redirects", False)
    End If
    Dim req As HttpRequest
    req.InitializeGet("http://www.basic4android.com")
    hc.Execute(req, 1)
End Sub
Sub hc_ResponseSuccess (Response As HttpResponse, TaskId As Int)
    Log("success: " & Response.GetString("UTF8"))
End Sub
Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    Log("Error")
    Log(StatusCode)
    If Floor(StatusCode / 100) = 3 Then '3xx status
        If response <> Null Then
            Log("Redirect to: " & response.GetHeaders.Get("Location"))
        End If   
    End If
End Sub
those not work with httputilis2
 

sule

Member
Licensed User
Longtime User
Do you see the code in HttpUtils2Service? It should be very simple to add this line.
this line canot be added
hc.Initialize("hc")
hc.SetHttpParameter("http.protocol.handle-redirects", False)
 

Cassie

Member
Licensed User
Longtime User
Hi,

can anyone have a sample how to call a secured http or "https" using HttpUtils2.

Thanks in advance
 

david13

Member
Licensed User
Hello, I got this error :(

src\anywheresoftware\b4a\samples\httputils2\httputils2service.java:154: error: cannot access ParseException

anywheresoftware.b4a.keywords.Common.Log(_response.GetString("UTF8"));

class file for org.apache.http.ParseException not found
 

david13

Member
Licensed User
Thanks for the answer,
I' using the core, Http,Reflection and stringutils libraries,, when I added HttpUtils2 I got this,
Error description: HttpUtils2Service is declared twice. You should either remove the library reference or the code module.Error parsing program.
 
Top