一、實現方式
在Java中,實現application/x-www-form-urlencoded內容類型通常涉及到發送HTTP POST請求。你可以使用java.net.HttpURLConnection或者第三方庫如Apache HttpClient來實現。
以下是使用HttpURLConnection發送application/x-www-form-urlencoded數據的代碼示例
二、解析效果
三、代碼實現
1、引入pom.xml依賴
<dependencies><dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.14.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.18</version><scope>provided</scope></dependency>
</dependencies>
2、PostReturnDto.java一個返回類
可以根據具體的項目場景匹配成自己寫的類
package com.test.util;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Map;@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class PostReturnDto implements Serializable {private static final long serialVersionUID = 1L;private String sendData;private JSONObject resJson;private JsonNode jsonNode;private Map<String,String> resHeader;private int code;}
3、核心工具類
package com.test.util;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.test.util.PostReturnDto;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;/*** 遠程數據交互工具*/
@Slf4j
public class RemoteDataMsg {public static PostReturnDto accessSendToMsg(String url,String cookie, String info){PostReturnDto postReturnDto = new PostReturnDto();log.info("訪問地址:{} ,獲取Cookie:{}",url,cookie);try {URL newurl = new URL(url);HttpURLConnection connection = (HttpURLConnection)newurl.openConnection();// 設置請求方法和頭部信息connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");connection.setRequestProperty("Cookie",cookie);connection.setUseCaches(false);connection.setDoInput(true);connection.setDoOutput(true);// 發送請求體if(!StringUtils.isEmpty(info)){try(OutputStream os = connection.getOutputStream()){os.write(info.getBytes(StandardCharsets.UTF_8));}}// 獲取響應碼和處理響應int code = connection.getResponseCode();log.info("返回響應碼:{}",code);// 獲取返回響應流,并將流轉換為UTF-8BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));// 將獲取到的流存入到StringBuilder中String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine())!= null){response.append(inputLine);}// 轉換為JSON輸出JSONObject resJson;try{resJson = JSONObject.parseObject(response.toString());log.info("轉換后的JSON報文數據:{}",resJson);postReturnDto.setResJson(resJson);}catch (Exception e){log.error("post訪問數據不是json格式 \n"+response.toString());e.printStackTrace();return postReturnDto;}in.close();// 關閉連接connection.disconnect();}catch (Exception e){e.printStackTrace();log.info("訪問異常");}return postReturnDto;}
}
4、測試主類
package com.test.util;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.test.PostReturnDto;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class RemoteMainTest {public static void main(String[] args) {// 自己的URL地址String url = "http://20.xxx.xx.xx:7003/acs/acs-dim/inDebtContract.ctrl?method=inDebtContractQurey";// Cookie信息String cookie = "locale=zh_CN; sysDefaultDate=2024-05-31; themeKey=default; use.new.theme=false; JSESSIONID=032077E515BB0977D72D2B3046442758; Authorization=eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiIyMTA2MDcxNDIyMTk2NjUyMjUxMyIsImV4cGlyZSI6MTcxOTg5MDEzMjczNywiZXhwIjoxNzUxNDI2MTMyfQ.mXdaznwZn4E_FPjAVHlbPIdsqYnZ6OjK7pvHqP2oGmw";// 參數信息,拼接的String info = "_startRow=0&_rowCount=30&productId=10000000000002422541";// 開始調用PostReturnDto res = RemoteDataMsg.accessSendToMsg(url,cookie,info);// 返回值做下簡單判斷if(res.getCode()==0 && res.getResJson() != null){// 解析JSONArray dataList = res.getResJson().getJSONArray("data");if(dataList.size()>0){for (int i=0;i<dataList.size();i++) {JSONObject data = dataList.getJSONObject(i);String checkerId = data.getString("checkerId"); //String instrId = data.getString("instrId"); //String txId = data.getString("txId"); //// 循環打印上面解析出的3個字段,具體解析按自己的項目場景,這只是簡單的業務案例log.info("checkerId={},instrId={},txId={}",checkerId,instrId,txId);}}}}
}
四、知識拓展
- application/x-www-form-urlencoded: 窗體數據被編碼為名稱/值對,這是標準的編碼格式。
- multipart/form-data: 窗體數據被編碼為一條消息,頁上的每個控件對應消息中的一個部分。
- text/plain: 窗體數據以純文本形式進行編碼,其中不含任何控件或格式字符。
form的enctype屬性為編碼方式,常用有兩種:
- application/x-www-form-urlencoded
- multipart/form-data,默認為application/x-www-form-urlencoded。
1、當action為get時,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2…),然后 把這個字串append到url后面,用&分割,加載這個新的url。
2、當action為post時,瀏覽器把form數據封裝到http body中,然后發送到server。
3、如果沒有type=file控件,用默認的application/x-www-form-urlencoded就可以了。
4、如果有type=file控件,就要用到multipart/form-data了。瀏覽器會把整個表單以控件為單位分割,并為每個部分加上Content- Disposition(form-data或者file),Content-Type(默認為text/plain),name(控件name)等信息,并加上分割符(boundary)。