java 模拟http请求,通过流(stream)的方式,发送json数据和文件
发送端:
/**
* 以流的方式
* 发送文件和json对象
*
* @return
*/
public static String doPostFileStreamAndJsonObj(String url, List<String> fileList, JSONObject json) {
String result = "";//请求返回参数
String jsonString = json.toJSONString();//获得jsonstirng,或者toString都可以,只要是json格式,给了别人能解析成json就行
// System.out.println("================");
// System.out.println(xml);//可以打印出来瞅瞅
// System.out.println("================");
try {
//开始设置模拟请求的参数,额,不一个个介绍了,根据需要拿
String boundary = "------WebKitFormBoundaryUey8ljRiiZqhZHBu";
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "Keep-Alive");
//这里模拟的是火狐浏览器,具体的可以f12看看请求的user-agent是什么
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Charsert", "UTF-8");
//这里的content-type要设置成表单格式,模拟ajax的表单请求
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// 指定流的大小,当内容达到这个值的时候就把流输出
conn.setChunkedStreamingMode(10240000);
//定义输出流,有什么数据要发送的,直接后面append就可以,记得转成byte再append
OutputStream out = new DataOutputStream(conn.getOutputStream());
byte[] end_data = ("\r\n--" + boundary + "--\r\n").getBytes();// 定义最后数据分隔线
StringBuilder sb = new StringBuilder();
//添加form属性
sb.append("--");
sb.append(boundary);
sb.append("\r\n");
//这里存放要传输的参数,name = xml
sb.append("Content-Disposition: form-data; name=\"JsonObj\"");
sb.append("\r\n\r\n");
//把要传的json字符串放进来
sb.append(jsonString);
out.write(sb.toString().getBytes("utf-8"));
out.write("\r\n".getBytes("utf-8"));
int leng = fileList.size();
for (int i = 0; i < leng; i++) {
File file = new File(fileList.get(i));
if(file.exists()){
sb = new StringBuilder();
sb.append("--");
sb.append(boundary);
sb.append("\r\n");
//这里的参数啥的是我项目里对方接收要用到的,具体的看你的项目怎样的格式
sb.append("Content-Disposition: form-data;name=\"File"
+ "\";filename=\"" + file.getName() + "\"\r\n");
//这里拼接个fileName,方便后面用第一种方式接收(如果是纯文件,不带其他参数,就可以不用这个了,因为Multipart可以直接解析文件)
sb.append("FileName:"+ file.getName() + "\r\n");
//发送文件是以流的方式发送,所以这里的content-type是octet-stream流
sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] data = sb.toString().getBytes();
out.write(data);
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
int j = i + 1;
if (leng > 1 && j != leng) {
out.write("\r\n".getBytes()); // 多个文件时,二个文件之间加入这个
}
in.close();
}else{
System.out.println("没有发现文件");
}
}
//发送流
out.write(end_data);
out.flush();
out.close();
// 定义BufferedReader输入流来读取URL的响应
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
result += line;
}
// System.out.println("================");
// System.out.println(result.toString());//可以把结果打印出来瞅瞅
// System.out.println("================");
//后面可以对结果进行解析(如果返回的是格式化的数据的话)
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
return result;
}
----------------------------------
发送端测试类
public static void main(String args[]) throws Exception {
//模拟流文件及参数上传
String url = "http://127.0.0.1:8090/kty/test/receiveStream";
//文件列表,搞了三个本地文件
List<String> fileList = new ArrayList<>();
fileList.add("F:\\me\\photos\\动漫\\3ba39425fec1965f4d088d2f.bmp");
fileList.add("F:\\me\\photos\\动漫\\09b3970fd3f5cc65b1351da4.bmp");
fileList.add("F:\\me\\photos\\动漫\\89ff57d93cd1b72cd0164ec9.bmp");
//json字符串,模拟了一个,传图片名字吧
String jsonString = "{\n" +
" \"token\": \"stream data\", \n" +
" \"content\": [\n" +
" {\n" +
" \"id\": \"1\", \n" +
" \"name\": \"3ba39425fec1965f4d088d2f.bmp\"\n" +
" }, \n" +
" {\n" +
" \"id\": \"2\", \n" +
" \"name\": \"09b3970fd3f5cc65b1351da4.bmp\"\n" +
" }, \n" +
" {\n" +
" \"id\": \"3\", \n" +
" \"name\": \"89ff57d93cd1b72cd0164ec9.bmp\"\n" +
" }\n" +
" ]\n" +
"}";
JSONObject json = JSONObject.parseObject(jsonString);
doPostFileStreamAndJsonObj(url, fileList, json);
}
-----------------------------------------
接收端:
@RestController
@RequestMapping("/test")
//跨域注解
@CrossOrigin
public class TestController {
/**
* 接收流信息
*
* @param request
* @return
*/
@PostMapping("/receiveStream")
public String receiveStream(HttpServletRequest request) {
String result = "";
System.out.println("进来了");
try {
//获取request里的所有部分
Collection<Part> parts = request.getParts();
for (Iterator<Part> iterator = parts.iterator(); iterator.hasNext(); ) {
Part part = iterator.next();
System.out.println("名称========" + part.getName());
if ("JsonObj".equals(part.getName())) {
//解析json对象
BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream()));
String line = "";
String parseString = "";
while ((line = reader.readLine()) != null) {
parseString += line;
}
JSONObject json = JSONObject.parseObject(parseString);
System.out.println("接收到的json对象为=====" + json.toJSONString());
} else if ("File".equals(part.getName())) {
String fileName = "";
Long size = part.getSize();
//文件名的获取,可以直接获取header里定义好的FIleName(大部分没有),或从Content-Disposition去剪切出来
// String head = part.getHeader("Content-Disposition");
// fileName = head.substring(head.indexOf("filename=")+ 10, head.lastIndexOf("\""));
fileName = part.getHeader("FileName");
System.out.println(fileName + size);
// //这里就是文件,文件流就可以直接写入到文件了
// InputStream inputStream = part.getInputStream();
// OutputStream outputStream = new FileOutputStream(fileName);
// int bytesWritten = 0;
// int byteCount = 0;
// byte[] bytes = new byte[1024];
// while ((byteCount = inputStream.read(bytes)) != -1) {
// outputStream.write(bytes, bytesWritten, byteCount);
// bytesWritten += byteCount;
// }
// inputStream.close();
// outputStream.close();
}
}
//如果嫌上面获取文件的麻烦,用下面这个比较简单,解析成multipartFile
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//统计文件数
Integer fileCount = 0;
//请求里key为File的元素(即文件元素)
List<MultipartFile> list = multiRequest.getFiles("File");
while (fileCount < list.size()) {
MultipartFile file = list.get(fileCount);
System.out.println(file.getName());
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());
fileCount++;
}
System.out.println("共有" + fileCount + "个文件");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
java 模拟http请求,通过流(stream)的方式,发送json数据和文件的更多相关文章
- 上curl java 模拟http请求
最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...
- curl java 模拟http请求
curl java 模拟http请求 直接上代码: public static void main(String args[]) throws Exception { String url = &qu ...
- java模拟post请求发送json
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
- Java模拟http请求调用远程接口工具类
package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...
- Java 模拟http请求
package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...
- java模拟http请求(代理ip)
java实现动态切换上网IP (ADSL拨号上网) java动态设置IP java模拟http的Get/Post请求 自动生成IP模拟POST访问后端程序 JAVA 动态替换代理IP并模拟POST
- Java模拟http请求远程调用接口工具类
package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...
- java模拟http请求
java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; impo ...
- Java模拟POST请求发送二进制数据
在进行程序之间数据通信时我们有时候就需要自定义二进制格式,然后通过HTTP进行二进制数据交互.交互的示例代码如下: public static void main(String[] args) { S ...
随机推荐
- POJ - 3376 Finding Palindromes manacher+字典树
题意 给n个字符串,两两拼接,问拼接后的\(n\times n\)个字符串中有多少个回文串. 分析 将所有正串插入字典树中,马拉车跑出所有串哪些前缀和后缀为回文串,记录位置,用反串去字典树中查询,两字 ...
- EM算法 小结
猴子吃果冻 博客园 首页 新随笔 联系 管理 订阅 随笔- 35 文章- 0 评论- 3 4-EM算法原理及利用EM求解GMM参数过程 1.极大似然估计 原理:假设在一个罐子中放着许多白球和 ...
- Selenium报错:StaleElementReferenceException
一个学生在操作页面跳转时遇到一个Selenium报错, 如下图所示: StaleElementReferenceException: Message: stale element reference: ...
- 2016 Multi-University Training Contest 1 部分题解
第一场多校,出了一题,,没有挂零还算欣慰. 1001,求最小生成树和,确定了最小生成树后任意两点间的距离的最小数学期望.当时就有点矛盾,为什么是求最小的数学期望以及为什么题目给了每条边都不相等的条件. ...
- shell编程之 ()[] {}
shell脚本中各种括号的区别以及用法 2018年08月19日 14:55:33 M_QiJunChao 阅读数:273 最近学到了shell脚本编程,觉得脚本中的不同括号有不同的用处,以及有些括 ...
- Consider defining a bean of type `xxx` in your configuration问题解决
在使用SpringBoot装配mybatis时出现了异常 *************************** APPLICATION FAILED TO START *************** ...
- 【软件工程】Beta冲刺(1/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...
- jetbrains 2019 激活 error 1653219 解决办法
我以前用PyCharm按照http://idea.lanyus.com/上的激活码直接可激活. 后来用到IDEA(最新版)了之后激活报错.错误代码为1653219. 后参考博客 解决办法: 把host ...
- 笔记:YSmart: Yet Another SQL-to-MapReduce Translator
http://web.cse.ohio-state.edu/hpcs/WWW/HTML/publications/papers/TR-11-7.pdf Introduce样例sql语句:" ...
- Flume-概述
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume 基于流式架构,灵活简单. Flume最主要的作用就是,实时读取服务器本地磁盘的数据, ...