目录

  • 第一种:post多个文件
  • 第二种:参数以json的格式post到服务器
  • 第三种:将key:value的值post到服务端

第一种:post多个文件

客户端的使用方法:

需要注意的点:

  1. 这里是为了方便使用才进行整合到DeliveryService里面,使用的时候引用该服务类即可。
  2. sendToCenter方法作为入口,传入文件数组File[ ]和服务端的地址,但是真正传输过程是在其调用的sendHttpPostRequest的方法。
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;import java.io.*;
import java.net.*;/*** 传输服务*/
@Component
public class DeliveryService {/*** 将文件上传到服务端* @param files 文件集合*/public String sendToCenter(File[] files,String url){String response = "";try {//中心服务器地址String serverUrl = url + "getFileByClient";//发送到中心服务器,并且获取响应结果response = sendHttpPostRequest(serverUrl, files);System.out.println("响应结果的内容为:"+response);} catch (Exception e) {e.printStackTrace();}return response;}/*** 通过post方式传送到中心服务器* @param serverUrl 服务器地址* @param files 文件集合* @return* @throws Exception*/public String sendHttpPostRequest(String serverUrl, File[] files) throws Exception {String BOUNDARY = "----------" + System.currentTimeMillis();// 向服务器发送post请求URL url = null;try {url = new URL(serverUrl);} catch (MalformedURLException e) {e.printStackTrace();return e.getMessage();}HttpURLConnection connection = null;try {connection = (HttpURLConnection) url.openConnection();} catch (IOException e) {e.printStackTrace();return e.getMessage();}// 发送POST请求头信息connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);try {connection.setRequestMethod("POST");} catch (ProtocolException e) {e.printStackTrace();return e.getMessage();}connection.setRequestProperty("Connection", "Keep-Alive");connection.setRequestProperty("Charset", "UTF-8");connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);StringBuilder message = new StringBuilder();//存放请求信息// 链接服务器获得输出流try (OutputStream out = new DataOutputStream(connection.getOutputStream())) {// 循环读取上传文件读取个文件for (int i = 0; i < files.length; i++) {message.delete(0, message.length());message.append("--");message.append(BOUNDARY);message.append("\r\n");message.append("Content-Disposition: form-data;name=\"files\";filename=\"" + files[i].getName() + "\"\r\n");message.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = message.toString().getBytes("utf-8");// 输出文件表头out.write(head);// 文件正文部分// 把文件以流文件的方式 推入到url中try (DataInputStream in = new DataInputStream(new FileInputStream(files[i]))) {int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {out.write(bufferOut, 0, bytes);}} catch (IOException e) {e.printStackTrace();}// 写入两个文件之间得分隔符,如果没有两个文件内容会被写在一个文件中out.write("\r\n".getBytes("utf-8"));}// 结尾部分byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线out.write(foot);out.flush();System.out.println("--------------------------------------");System.out.println("out的内容:"+out);} catch (IOException e1) {e1.printStackTrace();return e1.getMessage();}// 4. 从服务器获得回答的内容String strLine = "";String strResponse = "";try (InputStream responseIO = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(responseIO))) {while ((strLine = reader.readLine()) != null) {strResponse += strLine + "\n";}} catch (IOException e) {e.printStackTrace();return e.getMessage();}return strResponse;}
}

客户端的post逻辑是有了,那么服务端怎么去接收呢?

服务端的controller端接收的代码:

@PostMapping("/getFileByClient")
public String getFileByClient(MultipartFile[] files){String response = "";try {ArrayList<File> fileArrayList = new ArrayList<>();//获取到前置机发送过来文件for (MultipartFile mufile : files) {File file = UseUtils.multipartFileToFile(mufile);fileArrayList.add(file);}//......逻辑代码} catch (Exception e) {e.printStackTrace();}return response;
}

由上述代码可以知道,是用了 MultipartFile[ ] 的格式去接收传过来的文件,然后将每个MultipartFile取出转成File,存入集合中就可以操作文件了。

上面中MultipartFile转成File的方法我是封装了的,这里给出具体逻辑,如下:

public static File multipartFileToFile(MultipartFile file) throws Exception {File toFile = null;if (file.equals("") || file.getSize() <= 0) {file = null;} else {InputStream ins = null;ins = file.getInputStream();toFile = new File(file.getOriginalFilename());inputStreamToFile(ins, toFile);ins.close();}return toFile;}

但是,是不是感觉这种自写的post请求有点太麻烦,是不是觉得是集成好的工具就更简单了,这里就给出我使用到的一种,就是使用hutool集成好的工具包。

只需要引入hutool的依赖:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>
</dependency>

然后在需要使用的post请求的逻辑中使用hutool的HttpUtil工具类:

HashMap<String, Object> parm = new HashMap<>();
File[] listFile = dir.listFiles();
parm.put("files",listFile);
response = HttpUtil.post(url+"getFileByClient",parm);

上述代码需要注意的点:

  1. dir是一个目录,里面存放了需要上传的文件
  2. parm的键要用files才能识别出来(我也不确定是不是这样理解)

服务端的接收代码不用改就可以接收到传过来的文件,这样使用工具类就会简单一点了。


第二种:参数以json的格式post到服务器

这种方式是把参数以json的格式进行传输,如:

JSONObject jsonObject = new JSONObject();
jsonObject.put("code","007");

然后再以 jsonObject.toString() 的形式传入data参数中。

/*** 携带code去请求服务端* @param serverUrl 服务端地址* @param data 发送的code* @return*/public String sendCodeToCenter(String serverUrl, String data) throws Exception{String encoding = "utf-8";String body = "";//创建httpclient对象CloseableHttpClient client = HttpClients.createDefault();//创建post方式请求对象HttpPost httpPost = new HttpPost(serverUrl);//装填参数StringEntity s = new StringEntity(data.toString(), "utf-8");s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));//设置参数到请求对象中httpPost.setEntity(s);//设置header信息httpPost.setHeader("Content-type", "application/json");httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//执行请求操作,并拿到结果(同步阻塞)CloseableHttpResponse response = client.execute(httpPost);//获取结果实体HttpEntity entity = response.getEntity();if (entity != null) {//按指定编码转换结果实体为String类型body = EntityUtils.toString(entity, encoding);}EntityUtils.consume(entity);//释放链接response.close();return body;}

这种方式上传的参数,服务端的controller怎么接收呢?

这里使用到的方法就是:

/*** 获取客户端post过来的code* @param data code数据* @return 处理响应*/@PostMapping("/getCodeByClient")public String getCodeByClient(@RequestBody String data){JSONObject jsonObject = JSONObject.parseObject(data);Object getCode = jsonObject.get("code");String response = "";//......逻辑代码return response;}

可以注意到,是使用@RequestBody来接收的,接收到之后,再将字符串转成JSONObject 格式,再根据key取出value。

问题又来了,如果使用hutool工具包,客户端的逻辑怎么写?

这里对需要传输的参数进行处理:

JSONObject parm = new JSONObject();
parm.put("code",localCode);
HttpUtil.post(centerUrl + "getCodeByClient", parm.toString());

第三种:将key:value的值post到服务端

  1. 这种方式的效果和第二种的效果是一样的,只是用到的类不一样而已。
  2. 其服务端接收的方式也和第二种的一致。
  3. 客户端用hutool工具包的方式也和第二种的一致。
import org.springframework.stereotype.Component;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;@Component
public class SendResultService {/*** 发送结果到前置机*/public void sendResultToQianZhi(){//定义post的路径与参数String strURL = "";CenterResult centerResult = new CenterResult();String params = centerResult.toString();//post请求,返回响应结果String response = post(strURL, params);System.out.println("响应结果为:"+response);}/*** post接收信息的方法* @param strURL* @param params* @return*/public String post(String strURL, String params) {System.out.println(strURL);System.out.println(params);BufferedReader reader = null;try {URL url = new URL(strURL);// 创建连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestMethod("POST"); // 设置请求方式connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式connection.connect();//一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码out.append(params);out.flush();out.close();// 读取响应reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));String line;String res = "";while ((line = reader.readLine()) != null) {res += line;}reader.close();return res;} catch (IOException e) {e.printStackTrace();}return "error"; // 自定义错误信息}}

这篇内容记录的内容可能比较零散,不够全面,希望大伙能看得懂吧

用Java模拟post请求(也有hutool的HttpUtil使用)相关推荐

  1. curl命令java_上curl java 模拟http请求

    最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...

  2. java模拟HTTP请求(集合了网上搜来的各种)

    Java发送http请求 (get 与 post方法请求) Java发送http请求 (get 与post方法请求),以下代码经本人亲自调试可用!可以直接使用之. 注意:通过BufferedReade ...

  3. JAVA模拟HTTP请求中GET/POST方式

    package com.nxt.datacenter.utils;/*** 文件描述** @author: maomi* @date: 2019/5/31*/import java.io.Buffer ...

  4. Java模拟Http请求远程接口

    最近业务需要请求远程API接口,并返回相应的数据,同步到公司的服务器.因此编写了下面两个方法,主要是用Java.net.URL模拟http请求,主要写了POST和GET两个方法. 1.GET请求 /* ...

  5. Java模拟http请求

    Java实现http请求主要有3种方式:URLConnection.HttpURLConnection.HttpClient 一 URLConnection     抽象类,属于Java发送http请 ...

  6. java模拟浏览器请求HttpUtils,可秒杀京东优惠券

    2019独角兽企业重金招聘Python工程师标准>>> package com.boot.utils;import java.io.BufferedReader; import ja ...

  7. java模拟post请求上传图片

    本文档为个人博客文档系统的备份版本.作者:小游.作者博客:点击访问 /*** @description 模拟form表单,上传图片* @param fileName -- 图片路径* @return ...

  8. java模拟https请求_java-用httpclient模拟发送https请求

    --调用项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用jQuery post进行请求. ---但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而jquery的po ...

  9. java模拟post请求,HttpURLConnection--代码积累

    public JSONObject postRequest(Map<String,String> paramMap,String URL) throws Exception { JSONO ...

最新文章

  1. 2015第27周一非结构化数据
  2. scrapy-redis源码抛析
  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用
  4. Google Dremel 原理 - 如何能3秒分析1PB
  5. js 进阶篇 代码等级提升
  6. 第2章 Python 数字图像处理(DIP) --数字图像基础1 - 视觉感知要素 - 亮度适应与辨别
  7. php软件开发--sphinx索引静态化及伪静态
  8. python 启动参数_python启动参数
  9. 5.程序员的自我修养---Windows PE/COFF
  10. Codeforces Round #371 (Div. 2)
  11. 三国志战略版:Daniel_兵无常势分析
  12. Android系统中设置TextView的字符间距
  13. STM32F7 架构和资源分析
  14. 使用大白菜装机维护版软件取消Win7开机密码
  15. 从内地或海外前往香港的步骤攻略(2023.2.更新)
  16. 以太网物理层信号测试与分析
  17. 为什么 MySQL 采用 B+ 树作为索引?
  18. 通过5个简单的步骤每天回收5个小时14
  19. 扦插技术图解_桂花的扦插方法(图解)
  20. 我的GO+语言初体验-Go+入门安装避坑手册

热门文章

  1. PHP在linux下读取word
  2. MIT公开课18.06 Gilbert Strang 线性代数 笔记3 - 正定矩阵及其应用
  3. HP-SOCKET 使用C方法-Pull
  4. linux 字符界面
  5. 解决办法 Field userService in com.sxsj.controller.RegistLoginController required a bean of type
  6. 携程CPS分佣怎么推广?
  7. CAN总线与RS485的比较
  8. adb 静默安装_Android ROOT下静默安装并打开APP
  9. 基于JAVA酒店信息管理计算机毕业设计源码+数据库+lw文档+系统+部署
  10. 两级式单相光伏发电系统双闭环控制设计仿真