6

Sto aggiornando un'applicazione all'API 23 in cui org.apache.http è deprecato.org.apache.http.entity.FileEntity è obsoleto in Android 6 (Marshmallow)

Il mio codice (deprecato) corrente si presenta così:

HttpClient httpClient = new DefaultHttpClient(); 
File file = new File(attr.Value); 
String url = server_url; 
HttpPost request = new HttpPost(url); 
FileEntity fileEntity = new FileEntity(file, "image/png"); 
request.setEntity(fileEntity); 
HttpResponse response = httpClient.execute(request); 
String output = getContent(response.getEntity().getContent()); 

ho trovato alcuni suggerimenti di come questo dovrebbe essere fatto utilizzando HttpURLConnection, ma sono tutti molto più complesso quindi la soluzione attuale (che non può essere usato più). Sto parlando di molte righe di codice per l'esecuzione della stessa funzionalità di cui sopra.

Esempi sono: this page e this page

Qualcuno ha una buona soluzione più breve solida per questo?

+2

Vedere https://github.com/square/okhttp/wiki/Recipes#posting-a-file e https://github.com/square/okhttp/wiki/Recipes#posting-a-multipart-request per Ricette OkHttp di potenziale rilevanza. – CommonsWare

+0

@CommonsWare, grazie per il link. Ho letto su OkHttp e ho deciso di usarlo nella mia app. Mi prende cura di molti problemi ed è abbastanza facile da usare. Grazie per il consiglio. Scrivi questo come risposta e ti segnerò. – Ambran

+0

Un'altra opzione da consultare se si desidera utilizzare Volley http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity – BNK

risposta

8

Se si modifica il compileSdkVersion a 21, l'app verrà compilata in modo pulito. Detto questo, ci sono dei motivi per cui Google si sta ritirando dall'implementazione HttpClient integrata, quindi probabilmente dovresti cercare qualche altra libreria. Che "qualche altra libreria" potrebbe essere:

  • il built-in classico Java HttpUrlConnection, anche se, come hai trovato, le sue API lascia un po 'a desiderare
  • imballaggio indipendente di Apache di HttpClient for Android
  • OkHttp (la mia raccomandazione)
  • AndroidAsync

In particolare, OkHttp sembra avere un buon API per posting a file e posting a multipart form, che dovrebbe essere simile a ciò che sta facendo il codice HttpClient.

+0

Grazie per quello :-) – Ambran

+0

@Commonsware: Possiamo usare Volley per sostituire HttpClient? –

+0

@akshayrajkore: Sì, Volley sarebbe un'altra opzione. Rispetto a quelli che elencho, non ne sono tanto fan, semplicemente perché Google non lo sta supportando molto bene (ad es., Nessun vero JAR o AAR). – CommonsWare

3

Apache HttpClient 4.3 porta per Android era destinato a porre rimedio alla situazione fornendo versioni ufficiali compatibili con Google Android.

Dato che a partire dall'API di Android 23 il fork di HttpClient di Google è stato rimosso questo progetto è stato interrotto.

quegli utenti che vogliono continuare a utilizzare Apache HttpClient su Android si consiglia di prendere in considerazione

Apache HttpClient 4.3 porta per Android quando il targeting Android API 22 e più anziani

dependencies { 
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' 
} 

Apache pacchetti HttpClient per Android gestito da Marek Sebera durante il targeting di API Android 23 e successive

dependencies { 
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1' 
} 

tratto da Apache Sito Ufficiale: Apache HttpClient for Android

NOTA: Non c'è bisogno di usare useLibrary 'org.apache.http.legacy' dichiarazione, che è stata introdotta per i progetti che non migrano da Android fornito HttpClient classi. Per ulteriori explanation.

+0

Grazie, posso vedere che non esiste un vero motivo per utilizzare molto tempo sull'utilizzo di HttpURLConnection direttamente quando esistono buone alternative. Ho deciso di utilizzare la libreria di OkHttp (che utilizza HttpURLConnection stesso ma sicuramente in modo più efficiente che farei). Se è abbastanza buono per Twitter e FB, probabilmente è abbastanza buono per me. – Ambran

+0

Oppure puoi aggiungerlo al tuo 'build.gradle':' android { useLibrary 'org.apache.http.legacy' } '. Vedi [Modifiche di Android 6.0] (https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#boringSSL). – Sufian

0

Il miglior sostituto per HTTPClient è l'utilizzo di Volley. È molto più facile da usare, gestisce le code di richieste e le cache richieste. È completamente compatibile con quasi tutti i livelli API fino all'API 4.

Vedere il Android documentation su come farlo.