6

Uaktualniam aplikację do interfejsu API 23, gdzie org.apache.http jest przestarzałe.org.apache.http.entity.FileEntity jest przestarzałe w systemie Android 6 (Marshmallow)

Mój obecny (przestarzałe) kod wygląda następująco:

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

Znalazłem kilka wskazówek, jak należy to zrobić za pomocą HttpURLConnection, ale wszystkie one są o wiele bardziej skomplikowane następnie obecne rozwiązanie (które nie mogą być już więcej użytym). Mówię o wielu liniach kodu do wykonywania tej samej funkcjonalności, co powyżej.

Przykładami są: this page i this page

Czy ktoś ma solidne krótszy rozwiązanie dla tego?

+2

Zobacz https://github.com/square/okhttp/wiki/Recipes#posting-a-file i https://github.com/square/okhttp/wiki/Recipes#posting-a-multipart-request for Receptury OKHttp o potencjalnym znaczeniu. – CommonsWare

+0

@CommonsWare, dzięki za link. Czytałem o OkHttp i zdecydowałem się go użyć w mojej aplikacji. Dba o wiele problemów i jest dość łatwy w użyciu. Dzięki za wskazówkę. Napisz to jako odpowiedź, a ja cię oznam. – Ambran

+0

Inna opcja, aby odnieść się, jeśli chcesz użyć Volley http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity – BNK

Odpowiedz

8

Po zmianie numeru compileSdkVersion na 21 aplikacja będzie się kompilować w sposób czysty. Biorąc to pod uwagę, istnieją powody, dla których Google wycofuje się z wbudowanej implementacji HttpClient, więc prawdopodobnie powinieneś zastosować inną bibliotekę. Że „jakaś inna biblioteka” mogą być:

  • wbudowanych klasycznych Java HttpUrlConnection, choć, jak odkryli, jego API pozostawia wiele do życzenia
  • niezależne opakowanie Apache z HttpClient for Android
  • OkHttp (moje zalecenie)
  • AndroidAsync

W szczególności OkHttp wydaje się mieć całkiem dobry API dla posting a file i posting a multipart form, które powinny być podobne do tego, co robi twój kod HttpClient.

+0

Dzięki za to :-) – Ambran

+0

@Commonsware: Czy możemy użyć Volley do zastąpienia HttpClient? –

+0

@akshayrajkore: Tak, Volley byłaby inną opcją. W porównaniu do tych, które wymieniam, nie jestem aż tak wielkim fanem, po prostu dlatego, że Google nie wspiera tego wszystkiego dobrze (np. Brak rzeczywistego JAR lub AAR). – CommonsWare

3

Apache HttpClient 4.3 port dla Android był przeznaczony do zaradzenia sytuacji dostarczając oficjalne wersje kompatybilne z Google Androida.

Biorąc pod uwagę, że od wersji Android API 23 rozwidlenie Google'a HttpClient zostało usunięte z ten projekt został wycofany.

tych użytkowników, którzy chcą nadal korzystać z Apache HttpClient na Androida powinni rozważyć

Apache HttpClient 4.3 port dla Androida podczas kierowania Android API 22 i starszych

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

Apache httpclient pakiety dla Android obsługiwany przez Marka Seberę podczas kierowania na interfejs Android API 23 i nowszy:

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

zaczerpnięte z Apache Official Website: Apache HttpClient for Android

UWAGA: Nie trzeba używać useLibrary 'org.apache.http.legacy' komunikatu, który został wprowadzony na projekty, które nie migrują z Androidem przewidzianego httpclient klas. Dla dalszych explanation.

+0

Dziękuję za to, widzę że nie ma prawdziwego powodu, aby poświęcać dużo czasu na używanie HttpURLConnection bezpośrednio, gdy istnieją dobre alternatywy. Postanowiłem użyć biblioteki OkHttp (która sama używa HttpURLConnection, ale z pewnością wydajniej niż ja). Jeśli jest wystarczająco dobre dla Twittera i FB, to prawdopodobnie jest wystarczająco dobre dla mnie. – Ambran

+0

Lub możesz dodać to do 'build.gradle':' android { useLibrary 'org.apache.http.legacy' } '. Zobacz [Zmiany w Androidzie 6.0] (https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#boringSSL). – Sufian

0

Najlepszym zamiennikiem dla HTTPClient jest użycie Volley. Jest znacznie łatwiejszy w obsłudze, obsługuje kolejki żądań i buforuje żądania. Jest w pełni kompatybilny z prawie wszystkimi poziomami interfejsu API aż do API 4.

Zobacz, jak to zrobić: Android documentation.

Powiązane problemy