调用第三方Api接口操作说明And返回stream流之文件(PDF文件)

1,148 阅读2分钟

先看需求

需求:调用第三方Api接口,Get请求及Post请求以及进行面单下载(PDF格式文件) Api接口说明:Get请求,Post请求(请求头及请求参数)

操作说明

http请求使用的是HuTool工具类库 如果还不知道这个工具类的,没事,往下看;(给你看这是人情) 如果你看了还不会的,没事,请移步官网查看;(你看了还不会这是事故) 如果你看了也会了,这是人情世故; 好了 不废话了 上才艺。

才艺展示

需要两个依赖: 1丶HuTool 2丶Apache的commons-io(不做文件流不用导入)

<!--Hutool工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.3</version>
</dependency>


<!--Apache的commons-io-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

Get请求

url:第三方Api接口地址
//不带请求头			
String body = HttpUtil.createGet(url).execute().body();

-----------------------------------------------------------------------------------

//RequestHearder 请求头参数
Map<String, String> headers = new HashMap<>();
headers.put("TOKEN", token);

String body = HttpUtil.createGet(url).addHeaders(headers).execute().body();

-----------------------------------------------------------------------------------
返回结果为Json格式 这里是String类型 其实返回的是Json
如果要获取其中某个结果,如下:
String val =(JSON.parseObject(body).getString("code"));
String msg =(JSON.parseObject(body).getString("msg"));
String data =(JSON.parseObject(body).getString("data"));

如果结果里有反斜杠 需要进行反序列化 消除反斜杠
其实这个操作就是得到一个Object类型
Object parse = JSON.parse(data);

Post请求

//RequestBody请求参数
JSONObject jsons = new JSONObject();
jsons.put("prdCode", Order.getPrdCode());

//RequestHearder 请求头参数
Map<String, String> headers = new HashMap<>();
headers.put("TOKEN", token);


带请求头和参数
String body = HttpUtil.createPost(Url).addHeaders(headers).body(jsons).execute().body();

--------------------------------------------------------------------------------------
所以看懂了吧 
如果要发送带请求头的 使用.addHeaders()
如果要发送body参数  使用.body()

Post请求之文件下载

这里重点说明
这个问题搞了一天
也用了HttpUtils这个工具类去尝试 结果没成功

这里的请求参数是list 所以使用JSONArray 
//请求参数
JSONArray jsonArray = new JSONArray();
jsonArray.add(commodityCode);

// 请求头参数
Map<String, String> headers = new HashMap<>();
headers.put("TOKEN", token);

这里是重点 细心的人会发现这次没有去.body() 因为我们要获取的是流 不是json串;
HttpResponse execute = HttpUtil.createPost(url).addHeaders(headers).body(jsonArray).execute();

//设置页面不缓存 这一步一定要在流的写入前进行操作 不然程序会报错
response.reset();

InputStream inputStream = null;
try {
	//设置输出的文件名
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String format = sdf.format(new Date());
    String fileName = format+".pdf";

	//获取输入流
    inputStream = execute.bodyStream();
    
    //设置文件名(这一步要在流的写入前完成 否则设置不生效)
    response.setHeader("Content-Disposition", "attachment;filename="+fileName);  
          
	//输出流
    OutputStream output = response.getOutputStream();
            
    //这里使用了Apache的commons-io
    //IOUtils.copy(输入流,输出流) copy这个流就ok
    IOUtils.copy(inputStream,output);

	//这里要设置application为pdf格式
    response.setContentType("application/pdf;charset=UTF-8");
    }catch (Exception e) {
            log.error(e.getMessage());
            log.error("****************面单下载失败****************");
    }finally {
    		//关闭输入流  输出流可以不用关闭 不归咱们管
            inputStream.close();
    }

总结

看到这里\ 就结束了\ 剩下的我也没搞明白