7.17Java之HttpClient类发送application/x-www-form-urlencoded类型的请求
application/x-www-form-urlencoded
首先了解这个类型的传参方式: 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
<from>
标签中有一个属性为action,该属性定义了:当提交表单时向何处发送表单数据。
这里一定要搞清楚x-www-form-urlencoded的传参方式和该方式下的POST请求和GET请求的区别:
这种post格式跟get的区别在于,get把转换、拼接完的字符串用‘?’直接与表单的action连接作为URL使用,所以请求体里没有数据;而post把转换、拼接后的字符串放在了请求体里,不会在浏览器的地址栏显示
测试接口
首先拿到接口以后分析接口地址和请求方式:
可以看到请求方式是POST请求方式:
分析请求头类型:
可以看到是以表单的默认形式进行的提交
查看表单格式:
这里可以看到该接口是将参数拼成了字符串然后append到url后面在请求引用然后通过该引用调用的第三方接口。
具体的调用接口实现
//分析接口需要用到的属性
/*
1、Url
2、Cookie
3、Params
*/
//定义接口地址
private static final String Url = "";
//捕获到本次登录的Cookie值
private static final String Cookie = "";
//定义参数格式
private static final String Params = "platform=shopee&platform_accountid=12034&startTime=2021-07-16&endTime=2021-07-17&orderid=";
具体方法实现:
//由上面分析了该接口的传参形式,所以我们需要构造好一个POST请求体里面传参数
//构造Cookie存储
//创建Cookie存储
CookieStore cookieStore = new BasicCookieStore();
//设置Cookie值
BasicClientCookie cookie = new BasicClientCookie("Cookie", Cookie);
//设置域
cookie.setDomain("");
//设置路径
cookie.setPath("/");
//将设置好的Cookie放入接口引用中
cookieStore.addCookie(cookie);
//使用HttpClient创建登录客户端
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
//创建响应模型,通过请求对象获取响应对象--->发送登录请求
CloseableHttpResponse response = null;
创建请求体:(由于是直接把POST请求体的内容转换拼接,所以无需构造对象参数容器)--->上一篇内容是通过构造参数对象容器将容器内容放入Body中进行的传参
/*创建请求实体*/
try{
//创建登录方式引用
HttpPost httpPost = new HttpPost(url);
//设置请求配置
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(3000).setSocketTimeout(3000).build();
//设置POST请求配置
httpPost.setConfig(requestConfig);
//添加请求头
httpPost.addHeader("Content-Type", "x-www-form-urlencoded; charset=utf-8");
//设置接收形式
httpPost.setHeader("Accept", "application/json");
System.out.println(httpPost);
//创建登录实体
httpPost.setEntity(new StringEntity(params, Charset.forName("UTF-8")));
System.out.println(httpPost);
//判断请求实体情况
if (httpPost == null){
System.out.println("请求实体为空!");
return;
}else {
response = httpClient.execute(httpPost);
}
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
创建响应对象实体:
/*创建响应实体*/
try {
//从响应模型中获得响应实体
HttpEntity responseEntity = response.getEntity();
//打印响应状态
System.out.println("响应状态为:" + responseEntity.getContentType());
if (responseEntity!=null){
System.out.println("响应内容长度为:" + responseEntity.getContentLength());
System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
}
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}finally {
//关闭资源
try {
//判断客户端实体
if (httpClient != null) {
httpClient.close();
}
//判断响应实体
if (response != null) {
response.close();
}
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
It's a lonely road!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!