Libreria java richieste http multipart: HttpMultipartEngine

4 Aprile 2016 : Ho deciso di rilasciare i sorgenti della libreria sotto licenza GPLv3: https://github.com/pierprogramm/Http-Multipart-Engine-Java-Android

Per l’app android che sto sviluppando What Happened ho implementato una libreria per effettuare richieste http multipart su android.

Libreria java per richieste Http Multipart

Questa libreria è utilizzata con successo in android, ma è applicabile anche a progetti java generici, in quanto non utilizza librerie android native. In fase di test infatti, l’ho provata anche come applicativo java e si è comportata bene, l’unica accortezza è settare l’header User-Agent, altrimenti il server rigetterà la richiesta, ho implementato un metodo ad hoc al proposito.

In android, il modo migliore per eseguire una richiesta http (naturalmente asincronicamente, android non le permette nel main thread) è estendere la preesistente classe AsyncTask. Vi consiglio di leggere la documentazione e utilizzare AsyncTask al meglio per i vostri progetti, è sicuramente molto meglio usare lo standard invece di implementare da zero una classe per effettuare richieste asincrone.

La libreria incapsula il protocollo http multipart, la sintassi degli header delle richieste, l’aggiunta di part, la divisione del file in parti (detti chunks) in modo da avere un feedback sull’invio.

Clicca qui per visionare il javadoc

Per praticità di documentazione, riporto un codice snippet per android così da capire esattamente come deve essere utilizzata questa libreria.
Come detto prima, in android si preferisce estendere al classe AsyncTask, quindi il codice dovrà essere incluso nel metodo doInBackground. Questo codice invia in multipart con metodo POST, un file che avrà id “file” e un stringa che avrà id “data”.
N.B.: i metodo isCancelled() e publishProgress fanno parte di AsyncTask

Un altro esempio più generico di utilizzo della libreria per richieste http multipart, è descritto nel javadoc della classe MultipartRequest


—-><----

multipartRequest = new MultipartRequest(url, "POST");
 
Part filePart = new FilePart("file", new File(filePath));
Part stringPart = new StringPart("data", "dato stringa");
 
multipartRequest.addPart(filePart);
multipartRequest.addPart(stringPart);
 
final long totalDataLength = multipartRequest.getTotalDataByteLength();
multipartRequest.setListener(new ProgressListener() {
    @Override
    public void progress(long percentSent) {
        Log.d(TAG, "total byte=" + totalDataLength + ", " +
                "percentSent=" + percentSent);
 
        publishProgress(requestId, (int)percentSent);
    }
});
 
if(isCancelled()){
    Log.i(TAG, "Cancelled");
    return "cancel";
}
 
multipartRequest.setup();
 
if(isCancelled()){
    Log.i(TAG, "Cancelled");
    return "cancel";
}
 
result = multipartRequest.executeRequest();
return result;