前面介绍了通过HttpClient实现HTTP接口的GET方式调用和POST方式调用,那么文件下载与文件上传又该如何操作呢?其实在HttpClient看来,文件下载属于特殊的GET调用,只不过应答报文由字符串形式变成了文件形式;同样文件上传属于特殊的POST调用,只不过请求报文也由字符串形式变成了文件形式。那么文件下载与普通的GET调用相比,在代码上的区别仅仅是发送请求send方法的第二个参数,之前演示普通GET调用的时候,send方法第二个输入参数为BodyHandlers.ofString(),具体调用代码如下所示:
// 客户端传递请求信息,且返回字符串形式的应答报文
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
上面代码里的BodyHandlers名叫报文体处理器,它会将服务端返回的应答数据转换为指定形式,比如调用ofString方法表示自动把应答数据转成字符串。除了字符串,BodyHandlers还支持把应答数据转为其它格式,它支持的转换格式及其设置方法说明如下:
ofString:把应答数据转换为字符串。
ofByteArray:把应答数据转换为字节数组。
ofFile:把应答数据转换为文件(Path类型)。
ofInputStream:把应答数据转换为输入流。
ofLines:把应答数据转换为分行的字符串流(Stream类型)。
就文件下载而言,无疑使用ofFile方法最合适,因为该方法可将应答数据保存到本地文件,省去了繁琐的I/O操作。于是对普通的GET调用代码稍加改造,就变成了以下的文件下载代码:
// 从指定url下载文件到本地(同步方式)
private static void testSyncDownload(String path, String downloadUrl) {
// 从下载地址中获取文件名
String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/"));
// 创建默认的HTTP客户端对象
HttpClient client = HttpClient.newHttpClient();
// 创建默认的HTTP请求对象(默认GET调用)
HttpRequest request = HttpRequest.newBuilder