前言
需求:用户端访服务器A,拿到请求数据后,将数据传送到B服务器上去进行业务的实现;请求数据包含普通参数和文件数组。
正文
服务器A:(接受参数并进行数据传递)
前置准备代码:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
public class Param {
private Integer recordId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date recordTime;
private String content;
private MultipartFile[] file;
private List<Long> userIds;
}
主代码:
@PostMapping("/aTest")
public JSONObject aTest(Param param) throws Exception {
if (null == param.getContent()){ //参数校验
throw new ServiceException("内容不能为空"); //业务异常
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("服务器B的地址" + "/addComment");
httpPost.addHeader("AUTHORIZATION", request.getHeader(AUTHORIZATION)); //请求头
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(Charset.forName("utf-8"));
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//加上此行代码解决返回中文乱码问题
if(param.getFile()!=null){ //文件
MultipartFile[] files = param.getFile();
for (int i=0;i<files.length;i++){
MultipartFile file = files[i];
builder.addBinaryBody(file.getOriginalFilename(),file.getInputStream(),ContentType.MULTIPART_FORM_DATA,file.getOriginalFilename()); // 文件流
}
}
//普通参数都要变为字符类型进行传送
builder.addTextBody("recordId", param.getRecordId().toString()); //原为Integer类型
builder.addTextBody("recordTime",String.valueOf(param.getRecordTime().getTime())); //原为Date类型
builder.addTextBody("content", param.getContent()); //原为String类型
builder.addTextBody("userIds", StringUtils.join(param.getUserIds(), ",")); //原为List<Long>类型
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost); //执行提交
return JSONObject.parseObject(EntityUtils.toString(response.getEntity())); //转换类型并返回
}
服务器B:(拿到参数并进行业务处理)
前置准备代码:
public class testParam {
private String recordId;
private String recordTime;
private String content;
private StandardMultipartHttpServletRequest[] files;
private String userIds;
}
public class AddCommentParam {
private Integer recordId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date recordTime;
private String content;
private MultipartFile[] file;
private List<Long> userIds;
}
public class Response<T> {
private String code; //响应码
private String msg; //响应信息
private T body; //业务内容
}
主代码:
@PostMapping("/addComment")
public Response<Boolean> addComment(testParam param, HttpServletRequest request) throws IOException,ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
AddCommentParam param1 = new AddCommentParam();
//文件
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Iterator<String> iter = multipartRequest.getFileNames();
List<MultipartFile> file = new ArrayList<>();
while (iter.hasNext()) {
MultipartFile multipartFile = multipartRequest.getFile(iter.next());
file.add(multipartFile);
}
if(file.size()>0){
param1.setFile(file.toArray(new MultipartFile[file.size()]));
}
//普通参数
param1.setContent(param.getContent());
param1.setRecordId(Integer.valueOf(param.getRecordId()));
param1.setRecordTime(format.parse(format.format(Long.valueOf(param.getRecordTime()))));
param1.setUserIds(Arrays.stream(StringUtils.split(param.getUserIds())).map(a -> Long.parseLong(a)).collect(Collectors.toList()));
//todo:业务代码的实现;
return new Response<>(200,"操作成功",null);
}
总结
小白一枚,欢迎各位大佬指导!!!