6

Ich aktualisiere eine App auf API 23, wo org.apache.http veraltet ist.org.apache.http.entity.FileEntity ist in Android 6 (Marshmallow) veraltet

Mein aktueller (veraltet) Code wie folgt aussieht:

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()); 

ich einige Vorschläge, wie diese gefunden haben sollte HttpURLConnection verwenden getan werden, aber sie sind alle sehr viel komplexer dann die aktuelle Lösung (die nicht verwendet werden). Ich spreche über viele Codezeilen zum Ausführen der gleichen Funktionalität wie oben.

Beispiele sind: this page und this page

Hat jemand dafür eine gute und solide kürzere Lösung?

+2

Siehe https://github.com/square/okhttp/wiki/Recipes#posting-a-file und https://github.com/square/okhttp/wiki/Recipes#posting-a-multipart-request für OkHttp Rezepte von potentieller Relevanz. – CommonsWare

+0

@CommonsWare, danke für den Link. Ich habe über OkHttp gelesen und entschieden, es in meiner App zu verwenden. Es kümmert sich um viele Probleme für mich und ist sehr einfach zu bedienen. Danke für den Tipp. Schreibe dies als Antwort und ich werde dich markieren. – Ambran

+0

Eine andere Option für Sie zu verweisen, wenn Sie Volley http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-htpentiity verwenden möchten – BNK

Antwort

8

Wenn Sie Ihre compileSdkVersion auf 21 ändern, wird Ihre App sauber kompilieren. Davon abgesehen gibt es Gründe, warum Google von der integrierten HttpClient-Implementierung abrückt, also sollten Sie wahrscheinlich eine andere Bibliothek verfolgen. Die „eine andere Bibliothek“ könnte sein:

  • die eingebaute in klassischen Java HttpUrlConnection, obwohl, wie Sie gefunden haben, seine API etwas zu wünschen übrig lassen
  • Apache unabhängige Verpackung von HttpClient for Android
  • OkHttp (meine Empfehlung)
  • AndroidAsync

insbesondere scheint OkHttp ziemlich gut haben API für posting a file und posting a multipart form, die Ihrem HttpClient-Code ähnlich sein sollte.

+0

Danke dafür :-) – Ambran

+0

@Commonsware: Können wir mit Volley HttpClient ersetzen? –

+0

@akshayrajkore: Ja, Volley wäre eine andere Option. Im Vergleich zu den, die ich aufzählen möchte, bin ich nicht so ein Fan davon, einfach weil Google es nicht so gut unterstützt (z. B. keine tatsächliche JAR oder AAR). – CommonsWare

3

Apache Httpclient 4.3-Port für Android sollte die Situation beheben, indem offizielle Versionen kompatibel mit Google Android bereitgestellt wird.

Gegeben, dass von Android API 23 Googles Fork von HttpClient entfernt wurde, wurde dieses Projekt eingestellt.

Diejenigen Nutzer, die wird empfohlen, mit Apache Httpclient auf Android fortsetzen wollen

Apache Httpclient 4.3-Port für Android zu berücksichtigen, wenn Android API 22 Targeting und ältere

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

Apache Httpclient-Pakete für Android von Marek Sebera bei Android API 23 und neuer

verwaltet

genommen von Apache Offizielle Website: Apache HttpClient for Android

HINWEIS: Sie müssen useLibrary 'org.apache.http.legacy' Anweisung nicht verwenden, die für Projekte eingeführt wurde, die nicht von Android zur Verfügung gestellt Httpclient-Klassen migriert haben. Für weitere explanation.

+0

Danke dafür, ich kann sehen dass es keinen wirklichen Grund gibt, viel Zeit für die direkte Verwendung von HttpURLConnection zu verwenden, wenn gute Alternativen existieren. Ich habe mich entschieden, die OkHttp-Bibliothek zu verwenden (die selbst HttpURLConnection verwendet, aber sicherlich effizienter als ich). Wenn es gut genug für Twitter und FB ist, dann ist es wahrscheinlich gut genug für mich. – Ambran

+0

Oder Sie können dies zu Ihrem 'build.gradle' hinzufügen:' android { useLibrary 'org.apache.http.legacy' } '. Siehe [Änderungen an Android 6.0] (https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#boringSSL). – Sufian

0

Der beste Ersatz für HTTPClient verwendet Volley. Es ist viel einfacher zu bedienen, bearbeitet Anforderungswarteschlangen und speichert Ihre Anfragen zwischen. Es ist vollständig kompatibel mit fast allen API-Ebenen bis API 4.

Siehe die Android documentation, wie es geht.