一、实现方式
在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)。