springboot實(shí)現(xiàn)postman中form-data傳參實(shí)現(xiàn)過程
項目場景
開發(fā)中遇到對接需求時候,被要求用post請求傳form-data數(shù)據(jù)的時候一臉懵逼,在postman中可以調(diào)用,但是程序中怎么調(diào)用呢。
問題描述
在postman中調(diào)用是沒問題的

但是在程序中調(diào)用就報錯了,之前用的是HttpClient的方式請求的
public StringBuffer caller(Map<String,String> map, String strURL) {
// start
HttpClient httpClient = new HttpClient();
HttpConnectionManagerParams managerParams = httpClient
.getHttpConnectionManager().getParams();
// 設(shè)置連接超時時間(單位毫秒)
managerParams.setConnectionTimeout(30000);
// 設(shè)置讀數(shù)據(jù)超時時間(單位毫秒)
managerParams.setSoTimeout(120000);
PostMethod postMethod = new PostMethod(strURL);
// 將請求參數(shù)的值放入postMethod中
String strResponse = null;
StringBuffer buffer = new StringBuffer();
// end
try {
//設(shè)置參數(shù)到請求對象中
for(String key : map.keySet()){
postMethod.addParameter(key, map.get(key));
}
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode != HttpStatus.SC_OK) {
throw new IllegalStateException("Method failed: "
+ postMethod.getStatusLine());
}
BufferedReader reader = null;
reader = new BufferedReader(new InputStreamReader(
postMethod.getResponseBodyAsStream(), "UTF-8"));
while ((strResponse = reader.readLine()) != null) {
buffer.append(strResponse);
}
} catch (Exception ex) {
throw new IllegalStateException(ex.toString());
} finally {
// 釋放連接
postMethod.releaseConnection();
}
return buffer;
}請求普通的接口沒問題,但是第三方的接口會報錯:415 Unsupported Media Type ,很明顯是請求方式的問題,然后我在請求頭加上了multipart/form-data,接口請求通了,但是報錯參數(shù)錯誤,也就是接口沒獲取到參數(shù)。
postMethod.setRequestHeader("Content-Type", "multipart/form-data");原因分析
form-data主要是以鍵值對的形式來上傳參數(shù),同時參數(shù)之間以&分隔符分開。
我就嘗試?yán)胢ap進(jìn)行數(shù)據(jù)的的封裝Map<String,String>,結(jié)果發(fā)現(xiàn)后臺無法正確解析參數(shù),是因為map封裝后并不是以&鏈接的。
解決方案
最后利用spring來作為后端框架,form-data利用LinkedMultiValueMap對象來包裝多個參數(shù),參數(shù)以key-value形式,中間以&連接。
采用restTemplate代碼的實(shí)現(xiàn)如下:
public String caller(Map<String,String> map, String strURL){
HttpHeaders headers = new HttpHeaders();
MultiValueMap<String, Object> map= new LinkedMultiValueMap<>();
headers.add("Content-Type", "multipart/form-data");
//設(shè)置參數(shù)到請求對象中
for(String key : map.keySet()){
map.add(key, map.get(key));
}
HttpEntity<MultiValueMap<String, Object>> requestParams = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(apiUrl,requestParams,String.class);
String result =response.getBody();
return result;
}最后沒用HttpClient 的方式,改為了restTemplate的方式。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)將容器 Map中的內(nèi)容保存到數(shù)組
這篇文章主要介紹了Java實(shí)現(xiàn)將容器 Map中的內(nèi)容保存到數(shù)組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
RestTemplate get請求,header設(shè)置及傳參過程
文章介紹了在SpringBoot中使用RestTemplate進(jìn)行GET請求時的請求頭設(shè)置及傳參方式,包括無參數(shù)無請求頭、有請求頭無參數(shù)和有請求頭有參數(shù)三種情況,并提供了相應(yīng)的RestTemplate代碼示例2026-02-02
Java推送釘釘應(yīng)用消息實(shí)現(xiàn)過程
這篇文章主要介紹了Java推送釘釘應(yīng)用消息實(shí)現(xiàn)的相關(guān)資料,包括創(chuàng)建應(yīng)用、獲取憑證、申請接口權(quán)限及調(diào)用接口流程,并提供Maven依賴配置,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
基于mybatis batch實(shí)現(xiàn)批量提交大量數(shù)據(jù)
這篇文章主要介紹了基于mybatis batch實(shí)現(xiàn)批量提交大量數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
利用Mybatis?Plus實(shí)現(xiàn)一個SQL攔截器
SQL攔截器是一種用于攔截和修改Mybatis執(zhí)行的SQL語句的工具,通過使用SQL攔截器,開發(fā)人員可以在執(zhí)行SQL語句之前或之后對其進(jìn)行修改或記錄,本文就來借助一下Mybatis-Plus實(shí)現(xiàn)一個SQL攔截器吧2023-05-05
使用Arthas MCP對Java應(yīng)用進(jìn)行線上診斷的實(shí)踐指南
本文介紹了使用Arthas4.1.9診斷Java應(yīng)用常見問題(CPU飆高、內(nèi)存泄漏、死鎖、線程池滿、慢方法、異常被吞)的方法,并提出構(gòu)建一個全自動的Java應(yīng)用診斷系統(tǒng),通過AIagent結(jié)合MCP協(xié)議調(diào)用Arthas診斷工具,生成結(jié)構(gòu)化的診斷報告,簡化問題定位過程,需要的朋友可以參考下2026-05-05

