6

我正在將應用升級到API 23,其中org.apache.http已棄用。org.apache.http.entity.FileEntity在Android 6(棉花糖)中已棄用

我現在的(不建議使用)的代碼如下所示:

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

我發現了一些建議,這個應該怎麼使用HttpURLConnection來完成,但是他們都複雜得多,那麼當前的解決方案(不能再次使用)。我正在談論執行與上述相同功能的許多代碼行。

的例子是:this pagethis page

有沒有人有一個良好的堅實較短的解決方案?

+2

請參閱https://github.com/square/okhttp/wiki/Recipes#posting-a-file和https://github.com/square/okhttp/wiki/Recipes#posting-a-multipart-request for OkHttp食譜的潛在相關性。 – CommonsWare

+0

@CommonsWare,感謝您的鏈接。我一直在閱讀OkHttp,並決定在我的應用中使用它。它爲我處理很多問題,使用起來非常簡單。謝謝你的提示。寫這個作爲答案,我會標記你。 – Ambran

+0

另一種選擇,你可以參考,如果你想使用Volley http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity – BNK

回答

8

如果您將compileSdkVersion更改爲21,則您的應用程序將乾淨地編譯。話雖如此,Google爲什麼要退出內置的HttpClient實現是有原因的,所以你可能應該追求其他一些庫。這 「一些其他圖書館」可能是:

尤其OkHttp似乎有一個相當不錯的API爲posting a fileposting a multipart form,它應該與您的HttpClient代碼所做的相似。

+0

謝謝你:-) – Ambran

+0

@Commonsware:我們可以使用Volley替換HttpClient嗎? –

+0

@akshayrajkore:是的,排球將是另一種選擇。與我列出的相比,我沒有那麼喜歡它,只是因爲Google不支持這一切(例如,沒有實際的JAR或AAR)。 – CommonsWare

3

的Apache的HttpClient 4.3端口,用於Android的初衷是通過提供與谷歌的Android 兼容官方版本來補救 情況。

鑑於Android API 23谷歌的HttpClient fork已被 刪除,該項目已停產。

誰想要繼續使用Apache的HttpClient Android上 則宜考慮

的Apache的HttpClient 4.3端口,用於Android的指定Android API 22歲以上

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

的Apache HttpClient的包時,那些用戶Android定位Android API 23和更新版本時由Marek Sebera維護的Android

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

Apache的官方網站採取:Apache HttpClient for Android

注:您不必使用useLibrary 'org.apache.http.legacy'聲明,介紹了一種未從Android的遷移項目提供的HttpClient類。進一步explanation

+0

謝謝你,我可以看到沒有真正的理由在存在好的替代品時直接使用HttpURLConnection。我決定使用OkHttp庫(它本身使用HttpURLConnection,但肯定會更有效,然後我會這樣做)。如果這對Twitter和FB來說足夠好,那麼對我來說可能就足夠了。 – Ambran

+0

或者您可以將其添加到您的'build.gradle':'android {使用庫'org.apache.http.legacy' }'。請參閱[Android 6.0更改](https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#boringSSL)。 – Sufian

0

HTTPClient的最佳替代品是使用Volley。它更容易使用,處理請求隊列並緩存你的請求。它完全兼容API 4以下的幾乎所有API級別。

有關如何操作,請參閱Android documentation