基础代码

只包含最简单的代码,不包含乱码解决、文件上传。

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 发送表单的更多相关文章

  1. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  2. hyper发送表单数据

    前言 某个美丽的下午,运维把服务器上的nginx升级了,http协议也变成了http2.0,我本地的requests再也连接不到服务器,然后就找到了额hyper 但是hyper的文档写的很简单,而且相 ...

  3. JavaScript实现ajax发送表单数据

    知识点: 1.重置表单数据 2.获取表单数据(纯JavaScript) 3.设置表单数据(纯JavaScript) 4.ajax发送数据到客户端 (1)设置请求头,自己组合数据 (2)实例化表单对象, ...

  4. 使用 HttpClient 进行表单提交时,遇到的问题

    问题 在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据.在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求..NET 提供了 Multi ...

  5. 异步发送表单数据到JavaBean,并响应JSON文本返回

    1)  提交表单后,将JavaBean信息以JSON文本形式返回到浏览器 <form> 编号:<input type="text" name="id&q ...

  6. 两种请求方式URLHttpconnection 和Httpclient提交表单 网络篇(二)

    安卓有两种发送请求的方式:URLHttpconnection 和Httpclient 下面就来讲下这两种方式,这篇是最基础的使用 进阶请看第二篇  先占位 打扫卫生去了T T 快过年了 框架就放网络篇 ...

  7. 通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。

    工作记录用 1 大概页面,点击选择按钮,选择文件,填写备注并可以上传前预览,然后点击上传按钮开始上传 2 html+js代码 <h2>Test</h2> <div id= ...

  8. 21SpringMvc_异步发送表单数据到Bean,并响应JSON文本返回(这篇可能是最重要的一篇了)

    这篇文章实现三个功能:1.在jsp页面点击一个按钮,然后跳转到Action,在Action中把Emp(int id ,String salary,Data data)这个实体变成JSON格式返回到页面 ...

  9. vue入门(二) 让axios发送表单形式数据

    (一) 使用 axios vue-axios qs 1.qs是必不可少的插件 npm install --save axios vue-axios qs 2.安装完成后,在main.js插入以下代码 ...

  10. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    原文:[ASP.NET Web API教程]5.2 发送HTML表单数据:URL编码的表单数据 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

随机推荐

  1. Unity 检测FPS工具

    检测FPS工具 public class FPS : MonoBehaviour { public float f_UpdateInterval = 0.5F; private float f_Las ...

  2. HarmonyOS“一次开发,多端部署“优秀实践——玩机技巧,码上起航

    随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间按需调用.互助共享,让用户享受无缝的全场景体验.作为应用开发者,广泛的设备类型也能为应用带来广大的潜 ...

  3. Android 开发入门(3)

    0x05 活动 Activity (1)启停活动页面 a. 启动和结束 从当前页面跳转至新页面 startActivity(new Intent(this, [targetPage].class)) ...

  4. 【译】宣布在 Visual Studio 17.10 预览2中为 ARM64 架构提供 SSDT

    我们很高兴地宣布在 ARM64 中为 Visual Studio 推出 SQL Server Data Tools(SSDT).这个增强是在令人兴奋的17.10预览版2中发布的.arm64 上 Vis ...

  5. c# 前台和后台线程

    前台和后台线程 Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退 ...

  6. ES6中新增的Set、Map两种数据结构

    如果要用一句话来描述,我们可以说 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构 什么是集合?什么又是字典? 集合是由一堆无序的.相关联的,且不重复的内存结构[数学中称为元素]组成的组 ...

  7. 大厂面试题:ReentrantLock 与 synchronized异同点对比

    写在开头 在过去的博文中我们学习了ReentrantLock 与 synchronized这两种Java并发使用频率最高的同步锁,在很多大厂面试题中有个经典考题: ReentrantLock 与 sy ...

  8. 一站式指南:ClkLog部署环境配置指南

    在今天的数字化世界中,数据管理和分析工具的选择对于企业的成功至关重要.ClkLog作为一款强大的日志分析工具,能够帮助企业从海量数据中洞察业务.提升效率.然而,如何才能顺利部署ClkLog系统,使其最 ...

  9. 牛客网-SQL专项训练8

    ①在SQL中用条件表示价格在在30至40之间,应该如何表达(B) 解析:IN 与BETWEEN AND的区分 (数字型) 1.in (xx,xx,xx,...)  通常是不连续的,in(30,40)要 ...

  10. MaxCompute同步数据的网络配置

    MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库.数据集成功能已经集成到DataWorks作为 ...