使用Okhttp實現(xiàn)上傳文件+參數(shù)請求接口form-data
Okhttp實現(xiàn)上傳文件+參數(shù)請求接口form-data
有時候需要對接一些接口,而且接口傳參不僅需要各種類型的參數(shù),甚至還要上傳文件,所以遇到挺多坑,用postman的生成代碼也不好用,于是就有了這篇文章。
話不多說,我們直接上代碼
首先是service層
/** * 寫注釋是個好習(xí)慣 * * @param mFile * @param accountIndex * @param exportType * @param clear * @param email * @param dimensions * @return * @throws IOException */ public String upload(MultipartFile mFile, Integer accountIndex, String exportType, Boolean clear, String email, String dimensions) throws IOException { // 這里是MultipartFile轉(zhuǎn)File的過程 File file = new File(Objects.requireNonNull(mFile.getOriginalFilename())); FileUtils.copyInputStreamToFile(mFile.getInputStream(), file); // url接口路徑 String url = "http://localhost:8080/upload"; // file是要上傳的文件 File() 這邊我上傳的是excel,其他類型可以自己改這個parse RequestBody fileBody = RequestBody.create(MediaType.parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), file);//這邊是把file寫進來,也有寫路徑的,但我這邊是寫file文件,parse不行的話可以直接改這個"multipart/form-data" // 創(chuàng)建OkHttpClient實例,設(shè)置超時時間 OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(60L, TimeUnit.SECONDS) .writeTimeout(60L, TimeUnit.SECONDS) .readTimeout(60L, TimeUnit.SECONDS) .build(); // 不僅可以支持傳文件,還可以在傳文件的同時,傳參數(shù) MultipartBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) // 設(shè)置傳參為form-data格式 .addFormDataPart("account_index", String.valueOf(accountIndex)) .addFormDataPart("export_type", exportType) .addFormDataPart("clear", String.valueOf(clear)) .addFormDataPart("email", email) .addFormDataPart("dimensions", dimensions) .addFormDataPart("file", file.getName(), fileBody) // 中間參數(shù)為文件名 .build(); // 構(gòu)建request請求體,有需要傳請求頭自己加 Request request = new Request.Builder() .url(url) .post(requestBody) .build(); Response response = null; String result = ""; try { // 發(fā)送請求 response = okHttpClient.newCall(request).execute(); result = response.body().string(); log.info(url + "發(fā)送請求結(jié)果:" + result); if (!response.isSuccessful()) { log.info("請求失敗"); return "請求失敗"; } response.body().close(); } catch (IOException e) { log.error(e.getMessage()); } // 會在本地產(chǎn)生臨時文件,用完后需要刪除 if (file.exists()) { file.delete(); } return result; }
然后controller層的傳參需要用@RequestParam或者直接一個請求的實體類
如果使用實體類,千萬不要加@RequestBody,不然結(jié)合上傳文件會失效,上傳文件使用
@RequestPart("file") MultipartFile file進行傳參
(@RequestPart("file") MultipartFile file, @RequestParam("accountIndex") Integer accountIndex, @RequestParam("exportType") String exportType, @RequestParam(value = "clear", required = false) Boolean clear, @RequestParam("email") String email, @RequestParam(value = "dimensions", required = false) String dimensions)
示例如上,或者
(@RequestPart("file") MultipartFile file, RequestVo req)
請求成功,問題解決。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進新的idea中
這篇文章主要介紹了換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進新的idea中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11java實現(xiàn)查找PDF關(guān)鍵字所在頁碼及其坐標(biāo)
這篇文章主要介紹了java實現(xiàn)查找PDF關(guān)鍵字所在頁碼及其坐標(biāo)的方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09springboot 如何重定向redirect 并隱藏參數(shù)
這篇文章主要介紹了springboot 如何重定向redirect 并隱藏參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09使用Kubernetes和Docker部署Java微服務(wù)詳細(xì)代碼
Java微服務(wù)項目是一種基于Java技術(shù)棧的分布式系統(tǒng)開發(fā)方式,下面這篇文章主要給大家介紹了關(guān)于使用Kubernetes和Docker部署Java微服務(wù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07postman測試傳入List<String>參數(shù)方式
這篇文章主要介紹了postman測試傳入List<String>參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08java遠(yuǎn)程連接調(diào)用Rabbitmq的實例代碼
本篇文章主要介紹了java遠(yuǎn)程連接調(diào)用Rabbitmq的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07