okhttp实现上传文件+参数请求接口form-data
有时候需要对接一些接口,而且接口传参不仅需要各种类型的参数,甚至还要上传文件,所以遇到挺多坑,用postman的生成代码也不好用,于是就有了这篇文章。
话不多说,我们直接上代码
首先是service层
/**
* 写注释是个好习惯
*
* @param mfile
* @param accountindex
* @param exporttype
* @param clear
* @param email
* @param dimensions
* @return
* @throws ioexception
*/
public string upload(multipartfile mfile, integer accountindex, string exporttype,
boolean clear, string email, string dimensions) throws ioexception {
// 这里是multipartfile转file的过程
file file = new file(objects.requirenonnull(mfile.getoriginalfilename()));
fileutils.copyinputstreamtofile(mfile.getinputstream(), file);
// url接口路径
string url = "http://localhost:8080/upload";
// file是要上传的文件 file() 这边我上传的是excel,其他类型可以自己改这个parse
requestbody filebody = requestbody.create(mediatype.parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), file);//这边是把file写进来,也有写路径的,但我这边是写file文件,parse不行的话可以直接改这个"multipart/form-data"
// 创建okhttpclient实例,设置超时时间
okhttpclient okhttpclient = new okhttpclient.builder()
.connecttimeout(60l, timeunit.seconds)
.writetimeout(60l, timeunit.seconds)
.readtimeout(60l, timeunit.seconds)
.build();
// 不仅可以支持传文件,还可以在传文件的同时,传参数
multipartbody requestbody = new multipartbody.builder()
.settype(multipartbody.form) // 设置传参为form-data格式
.addformdatapart("account_index", string.valueof(accountindex))
.addformdatapart("export_type", exporttype)
.addformdatapart("clear", string.valueof(clear))
.addformdatapart("email", email)
.addformdatapart("dimensions", dimensions)
.addformdatapart("file", file.getname(), filebody) // 中间参数为文件名
.build();
// 构建request请求体,有需要传请求头自己加
request request = new request.builder()
.url(url)
.post(requestbody)
.build();
response response = null;
string result = "";
try {
// 发送请求
response = okhttpclient.newcall(request).execute();
result = response.body().string();
log.info(url + "发送请求结果:" + result);
if (!response.issuccessful()) {
log.info("请求失败");
return "请求失败";
}
response.body().close();
} catch (ioexception e) {
log.error(e.getmessage());
}
// 会在本地产生临时文件,用完后需要删除
if (file.exists()) {
file.delete();
}
return result;
}然后controller层的传参需要用@requestparam或者直接一个请求的实体类
如果使用实体类,千万不要加@requestbody,不然结合上传文件会失效,上传文件使用
@requestpart("file") multipartfile file进行传参
(@requestpart("file") multipartfile file,
@requestparam("accountindex") integer accountindex,
@requestparam("exporttype") string exporttype,
@requestparam(value = "clear", required = false) boolean clear,
@requestparam("email") string email,
@requestparam(value = "dimensions", required = false) string dimensions)示例如上,或者
(@requestpart("file") multipartfile file, requestvo req)请求成功,问题解决。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论