HttpClient 发送表单
基础代码
只包含最简单的代码,不包含乱码解决、文件上传。
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Test {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
try{
//创建 post 请求(fiddler 设置了监听 8888 端口)
HttpPost post = new HttpPost("http://127.0.0.1:8888");
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
post.setConfig(defaultRequestConfig);
//创建表单
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("key1","值1", ContentType.create("multipart/form-data",Consts.UTF_8));
builder.addTextBody("key2","值2", ContentType.create("multipart/form-data",Consts.UTF_8));
HttpEntity build = builder.build();
post.setEntity(build);
//发送请求
CloseableHttpResponse response = client.execute(post);
System.out.println(response.getEntity());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//关闭连接
client.close();
}catch (Exception e){}
}
}
}

可以看到没有乱码,并且都已经赋值,但是此时我们将 key 改成中文,就会变成乱码

即使上方已经将 Content-type 改成 UTF-8,但依旧乱码,因为此时只是设置了内容的值为 UTF-8,需要设置字段值也改成 UTF-8
解决中文乱码
方法一
设置字段模式为 HttpMultipartMode.RFC6532
builder.setMode(HttpMultipartMode.RFC6532);
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Test {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
try{
//创建 post 请求
HttpPost post = new HttpPost("http://127.0.0.1:8888");
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
post.setConfig(defaultRequestConfig);
//创建表单
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//设置模式,在 下方 build 方法中,会调用 new HttpRFC6532Multipart() 方法,其中字段默认编码就为 UTF-8 (一种取巧的方法)
builder.setMode(HttpMultipartMode.RFC6532);
builder.addTextBody("字段1","值1", ContentType.create("multipart/form-data",Consts.UTF_8));
builder.addTextBody("字段2","值2", ContentType.create("multipart/form-data",Consts.UTF_8));
HttpEntity build = builder.build();
post.setEntity(build);
//发送请求
CloseableHttpResponse response = client.execute(post);
System.out.println(response.getEntity());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//关闭连接
client.close();
}catch (Exception e){}
}
}
}

方法二
设置字段模式为 HttpMultipartMode.BROWSER_COMPATIBLE,同时设置编码为 UTF-8
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Consts.UTF_8);
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Test {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
try{
//创建 post 请求
HttpPost post = new HttpPost("http://127.0.0.1:8888");
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
post.setConfig(defaultRequestConfig);
//创建表单
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//设置为浏览器模式,其中字段会根据 builder.charset 来设置编码格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Consts.UTF_8);
builder.addTextBody("字段1","值1", ContentType.create("multipart/form-data",Consts.UTF_8));
builder.addTextBody("字段2","值2", ContentType.create("multipart/form-data",Consts.UTF_8));
HttpEntity build = builder.build();
post.setEntity(build);
//发送请求
CloseableHttpResponse response = client.execute(post);
System.out.println(response.getEntity());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//关闭连接
client.close();
}catch (Exception e){}
}
}
}

文件上传
一般 form 表单都会提供文件上传,直接添加 addBinaryBody 即可,其中该提供 inputSteam、文件重命名等方法,具体可自行研究
builder.addBinaryBody("文件字段3",new File("D:\\test\\部署路径.xlsx"));

发送form表单完整代码
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.File;
public class Test {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
try{
//创建 post 请求
HttpPost post = new HttpPost("http://127.0.0.1:8888");
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
post.setConfig(defaultRequestConfig);
//创建表单
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//(防止字段名中文乱码)设置为浏览器模式,其中字段会根据 builder.charset 来设置编码格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Consts.UTF_8);
//设置普通字段值
builder.addTextBody("字段1","值1", ContentType.create("multipart/form-data",Consts.UTF_8));
builder.addTextBody("字段2","值2", ContentType.create("multipart/form-data",Consts.UTF_8));
//添加文件
builder.addBinaryBody("文件字段3",new File("D:\\test\\部署路径.xlsx"));
HttpEntity build = builder.build();
post.setEntity(build);
//发送请求
CloseableHttpResponse response = client.execute(post);
System.out.println(response.getEntity());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//关闭连接
client.close();
}catch (Exception e){}
}
}
}
附带发送 body 请求代码
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.util.HashMap;
public class Test {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
try{
//创建 post 请求
HttpPost post = new HttpPost("http://127.0.0.1:8888");
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
post.setConfig(defaultRequestConfig);
//设置 body 值
HashMap<String, Object> map = new HashMap<>();
map.put("字段1","值1");
String jsonString = JSONObject.toJSONString(map);
post.setEntity(new StringEntity(jsonString, ContentType.APPLICATION_JSON));
//发送请求
CloseableHttpResponse response = client.execute(post);
System.out.println(response.getEntity());
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//关闭连接
client.close();
}catch (Exception e){}
}
}
}

HttpClient 发送表单的更多相关文章
- Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法
Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...
- hyper发送表单数据
前言 某个美丽的下午,运维把服务器上的nginx升级了,http协议也变成了http2.0,我本地的requests再也连接不到服务器,然后就找到了额hyper 但是hyper的文档写的很简单,而且相 ...
- JavaScript实现ajax发送表单数据
知识点: 1.重置表单数据 2.获取表单数据(纯JavaScript) 3.设置表单数据(纯JavaScript) 4.ajax发送数据到客户端 (1)设置请求头,自己组合数据 (2)实例化表单对象, ...
- 使用 HttpClient 进行表单提交时,遇到的问题
问题 在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据.在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求..NET 提供了 Multi ...
- 异步发送表单数据到JavaBean,并响应JSON文本返回
1) 提交表单后,将JavaBean信息以JSON文本形式返回到浏览器 <form> 编号:<input type="text" name="id&q ...
- 两种请求方式URLHttpconnection 和Httpclient提交表单 网络篇(二)
安卓有两种发送请求的方式:URLHttpconnection 和Httpclient 下面就来讲下这两种方式,这篇是最基础的使用 进阶请看第二篇 先占位 打扫卫生去了T T 快过年了 框架就放网络篇 ...
- 通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。
工作记录用 1 大概页面,点击选择按钮,选择文件,填写备注并可以上传前预览,然后点击上传按钮开始上传 2 html+js代码 <h2>Test</h2> <div id= ...
- 21SpringMvc_异步发送表单数据到Bean,并响应JSON文本返回(这篇可能是最重要的一篇了)
这篇文章实现三个功能:1.在jsp页面点击一个按钮,然后跳转到Action,在Action中把Emp(int id ,String salary,Data data)这个实体变成JSON格式返回到页面 ...
- vue入门(二) 让axios发送表单形式数据
(一) 使用 axios vue-axios qs 1.qs是必不可少的插件 npm install --save axios vue-axios qs 2.安装完成后,在main.js插入以下代码 ...
- 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
原文:[ASP.NET Web API教程]5.2 发送HTML表单数据:URL编码的表单数据 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
随机推荐
- MogDB/openGauss访问控制简介
MogDB/openGauss 访问控制简介 SQL 可以针对不同的数据库对象赋予不同的权限,这样就可以限制用户对数据的不必要访问,提高数据访问的安全性.常见的 SQL 权限如下: SELECT/UP ...
- 实验2 C语言分支与循环基础应用编程
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main() { ...
- Spring Cloud Alibaba 官方实践指南【文章有点长自备咖啡茶点】
注:本文内容均转自官方文档,方便胖友们学习,不代表博主观点. 链接地址:SpringCloudAlibaba | Spring Cloud Alibaba 基于网关实现 SpringCloud 服务发 ...
- docker 应用篇————tomcat例子[七]
前言 虽然我干的事情和java不多,但是例子是为了熟悉原理,而不是为了例子而例子的,故而整理一下tomcat的例子. 正文 使用官方示例: 然后运行一下. 没有找到然后进行下载了. 可以看到这里就已经 ...
- DDD领域驱动设计总结和C#代码示例
DDD(领域驱动设计)是一种软件设计方法,它强调以业务领域为核心来驱动软件的设计和开发. DDD 的设计初衷是为了解决复杂业务领域的设计和开发问题,它提供了一套丰富的概念和模式,帮助开发者更好地理解和 ...
- Oracle 与当前日期有关的内容
Oracle 与当前日期有关的内容 求当前日期是周几: 大概就是下面这种方法 to_char(date,'D') Select to_char(date,'ss') from dual取当前时间秒部分 ...
- 力扣304(java)-二维区域和检索-矩阵不可变(中等)
题目: 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) .实现 NumMa ...
- 简单、有效、全面的Kubernetes监控方案
简介:近年来,Kubernetes作为众多公司云原生改造的首选容器化编排平台,越来越多的开发和运维工作都围绕Kubernetes展开,保证Kubernetes的稳定性和可用性是最基础的需求,而这其中 ...
- 如何将一棵LSM-Tree塞进NVM
简介: 随着非易失内存产品的商业化推广,我们对于其在云原生数据库中大规模推广的潜力越来越有兴趣.X-Engine是阿里云数据库产品事业部PolarDB新型存储引擎团队研发的一个LSM-tree存储引 ...
- [FAQ] JS 时间戳格式化为 date
拷贝使用,不用引入第三方库 function formatDate (date = 0, fmt = 'yyyy-MM-dd hh:mm:ss') { date = new Date(+date) i ...