okhttp上傳大文件
❶ okhttp 上傳文件socket關閉怎麼解決
使用okhttp上傳文件時,每次上傳超過5M的文件就會失敗, java.net.SocketException: sendto failed: EPIPE (Broken pipe)
原因是okhttp的請求頭RequestBody出現了問題
原代碼:
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.addPart(Headers.of("Content-Disposition", "form-data; name=\"another\";filename=" + file.getName() + "")
,RequestBody.create(MediaType.parse("application/octet-stream"), file))
.build();
改正後的代碼,刪除了addPart
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.build();
❷ 張鴻洋 okhttp怎麼獲取cookie
OkHttp和HttpURLConnection一樣,是面向java的,而且是做socket層的事情的,使用時要在子線程調用,通過handler發送結果到主線程.而NoHttp和Volley不是做socket層的東西.直接在主線程就可以調用,拿到結果後直接更新UI,不需要用handler去發送,很簡單.不過我推薦使用NoHttp.原因是NoHttp封裝了:文件下載,斷點續傳,304緩存,302/303傳參數,傳文件,請求頭,多文件上傳,大文件上傳,Cookie自動管理等多種功能,這些是Volley而沒有,使用Volley時這些功能要我們去寫蠻多代碼來再次封裝.而且Volley用的HttpClient來解析的,Android6.0刪除了HttpClient後,我們在6.0下也不能使用Volley的源碼了,所以還是用NoHttp吧,NoHttp兼容2.0-6.0以上而使用OkHttp還需要我們自己去封裝,而且Android4.4之後NoHttp也是使用OkHttp做底層的.
❸ 為什麼okhttpclient不能builder
一、概述
最近在群里聽到各種討論okhttp的話題,可見okhttp的口碑相當好了。再加上Google貌似在6.0版本裡面刪除了HttpClient相關API,對於這個行為不做評價。為了更好的在應對網路訪問,學習下okhttp還是蠻必要的,本篇博客首先介紹okhttp的簡單使用,主要包含:
一般的get請求
一般的post請求
基於Http的文件上傳
文件下載
載入圖片
支持請求回調,直接返回對象、對象集合
支持session的保持
最後會對上述幾個功能進行封裝,完整的封裝類的地址見:https://github.com/hongyangAndroid/okhttp-utils
使用前,對於Android Studio的用戶,可以選擇添加:
compile 'com.squareup.okhttp:okhttp:2.4.0'1
或者Eclipse的用戶,可以下載最新的jar okhttp he latest JAR ,添加依賴就可以用了。
注意:okhttp內部依賴okio,別忘了同時導入okio:
gradle: compile 'com.squareup.okio:okio:1.5.0'
最新的jar地址:okio the latest JAR
二、使用教程
(一)Http Get
對了網路載入庫,那麼最常見的肯定就是http get請求了,比如獲取一個網頁的內容。
//創建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創建一個Request
final Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//請求加入調度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(final Response response) throws IOException
{
//String htmlStr = response.body().string();
}
}); 以上就是發送一個get請求的步驟,首先構造一個Request對象,參數最起碼有個url,當然你可以通過Request.Builder設置更多的參數比如:header、method等。
然後通過request的對象去構造得到一個Call對象,類似於將你的請求封裝成了任務,既然是任務,就會有execute()和cancel()等方法。
最後,我們希望以非同步的方式去執行請求,所以我們調用的是call.enqueue,將call加入調度隊列,然後等待任務執行完成,我們在Callback中即可得到結果。
看到這,你會發現,整體的寫法還是比較長的,所以封裝肯定是要做的,不然每個請求這么寫,得累死。
ok,需要注意幾點:
onResponse回調的參數是response,一般情況下,比如我們希望獲得返回的字元串,可以通過response.body().string()獲取;如果希望獲得返回的二進制位元組數組,則調用response.body().bytes();如果你想拿到返回的inputStream,則調用response.body().byteStream()
看到這,你可能會奇怪,竟然還能拿到返回的inputStream,看到這個最起碼能意識到一點,這里支持大文件下載,有inputStream我們就可以通過IO的方式寫文件。不過也說明一個問題,這個onResponse執行的線程並不是UI線程。的確是的,如果你希望操作控制項,還是需要使用handler等,例如:
@Override
public void onResponse(final Response response) throws IOException
{
final String res = response.body().string();
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mTv.setText(res);
}
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
我們這里是非同步的方式去執行,當然也支持阻塞的方式,上面我們也說了Call有一個execute()方法,你也可以直接調用call.execute()通過返回一個Response。
(二) Http Post 攜帶參數
看來上面的簡單的get請求,基本上整個的用法也就掌握了,比如post攜帶參數,也僅僅是Request的構造的不同。
Request request = buildMultipartFormRequest(
url, new File[]{file}, new String[]{fileKey}, null);
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("username","張鴻洋");
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(new Callback(){});12345678910
大家都清楚,post的時候,參數是包含在請求體中的;所以我們通過FormEncodingBuilder。添加多個String鍵值對,然後去構造RequestBody,最後完成我們Request的構造。
後面的就和上面一樣了。
(三)基於Http的文件上傳
接下來我們在介紹一個可以構造RequestBody的Builder,叫做MultipartBuilder。當我們需要做類似於表單上傳的時候,就可以使用它來構造我們的requestBody。
File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"username\""),
RequestBody.create(null, "張鴻洋"))
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"mFile\";
filename=\"wjd.mp4\""), fileBody)
.build();
Request request = new Request.Builder()
.url("http://192.168.1.103:8080/okHttpServer/fileUpload")
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback()
{
//...
});2526
上述代碼向伺服器傳遞了一個鍵值對username:張鴻洋和一個文件。我們通過MultipartBuilder的addPart方法可以添加鍵值對或者文件。
其實類似於我們拼接模擬瀏覽器行為的方式,如果你對這塊不了解,可以參考:從原理角度解析Android (Java) http 文件上傳
ok,對於我們最開始的目錄還剩下圖片下載,文件下載;這兩個一個是通過回調的Response拿到byte[]然後decode成圖片;文件下載,就是拿到inputStream做寫文件操作,我們這里就不贅述了。
關於用法,也可以參考泡網OkHttp使用教程
接下來我們主要看如何封裝上述的代碼。
三、封裝
由於按照上述的代碼,寫多個請求肯定包含大量的重復代碼,所以我希望封裝後的代碼調用是這樣的
附上出處鏈接:http://blog.csdn.net/lmj623565791/article/details/47911083
❹ Okhttp 使用(同步、非同步/get、post/上傳文件)
目前Android端調用網路請求最常用的框架就是OKHttp,目前項目中也經常會用到。OKHTTP有哪些特點呢?下面是官網給出的OKHTTP的特點:
官網地址: https://square.github.io/okhttp/
想要詳細了解HTTP/2,可以參考: https://www.jianshu.com/p/828a29bced9f
接下來就可以愉快的開始使用OKhttp進行開發了。
OKhttpclient通過builder構建,構建的時候涉及到很多配置項,本次簡單對其中一些配置項做了說明,後續會對一些重要的配置項做專題說明正察。在實際的項目中的配置項根據項目具體需求進行配置。
上述配置項中比較常用的有
同步get請求會阻塞當前線程直到返回舉枝茄結果,請求大致分為四個步驟:
非同步請求方式的步驟和上述前兩個步驟基本搭拍一致,主要發起請求的方式發生了變化,結果通過回調返回。這種請求方式對請求的線程沒有限制。
與get請求方式不同的是post請求需要構建RequestBody,在請求時攜帶RequestBody。
❺ HTTP連接客戶端,選 HttpClient 還是 OkHttp
在進行HTTP連接客戶端的選擇時,主要考慮兩個選項:HttpClient和OkHttp。通過對比它們在使用、性能、超時配置等方面的特點,可以幫助我們做出更明智的決定。以下是基於這些方面的對比分析。
使用方面,HttpClient和OkHttp主要用於調用其他服務,通常使用HTTP協議,常見的請求類型包括GET、PUT、POST和DELETE。以下為兩種客戶端在不同請求類型下的使用步驟。
HttpClient使用介紹:
- 創建連接:連接為同步連接。
- GET請求:使用HttpGet表示,通過HttpClient的execute方法發送。
- PUT請求、POST請求、上傳文件:通過添加對象或文件到請求中實現。
- DELETE請求:執行取消請求:調用abort方法。
OkHttp使用介紹:
- 創建連接:更為簡潔。
- GET請求、PUT請求、POST請求、上傳文件:通過特定方法(如.post、.delete、.put、.get)表示請求類型,不需要創建特定請求類。
- DELETE請求:執行取消請求:調用cancel方法。
依賴包方面:HttpClient需要額外引入非同步請求依賴,以支持非同步請求和文件上傳。而OkHttp則集成度更高,提供了更全面的功能。
超時設置:HttpClient的超時時間設置在請求類型上,如HttpGet,而OkHttp則直接在客戶端上進行設置。在單例模式下,HttpClient設置超時更為靈活,允許根據不同請求類型設置不同時間;在非單例模式下,OkHttp的超時設置影響所有請求,靈活性較低。
性能比較:測試結果顯示,在單例模式下,HttpClient的響應速度更快,非單例模式下,OkHttp性能更優。這主要與HttpClient在非單例模式下創建連接耗時較長有關。
總結:OkHttp和HttpClient在性能和使用上相當,選擇哪一方主要取決於實際業務需求。推薦閱讀更多相關教程和文章以獲取更多深入知識。關注更多技術動態,持續學習與進步。希望這段分析對您的選擇有所幫助。明天再見!