Java 中的 Http 客户端 API:管理文件

.

本文的目的是展示如何使用 Http Client API 从 REST 端点上传/下载文件内容。

让我们回顾一下调用 Web 资源的步骤,因为此过程与上传/下载文件数据相同。

  • 如果需要,将创建 HttpClient 对象并进一步配置(超时、身份验证器、http 版本、followRedirects…)
  • Http 请求是通过 URL 创建的。可以选择设置其他功能。例如,http 方法、http 标头、超时和 http 版本。
  • 然后,HttpResponse 不是直接创建的,而是作为使用 HttpClient 发送 HttpRequest 的结果返回的。完成后,可以从中检查状态代码和正文(如果有)。

现在,让我们继续下载文件用例。

我们将按照上述步骤来执行此操作。但首先,让我们看看后端。端点以字节数组的形式发回文件内容

API 提供了 BodyHandlers 类(HttpResponse 内部静态类)来管理常见的响应类型,例如 String 或 File。以下是此类中可用的一些有用方法的列表:

  1. ofByteArray:主体写入字节数组。
  2. ofFile:正文写入文件,HttpResponse.body() 返回对其 Path 的引用。
  3. ofFileDownload:主体完全写入文件,并且 HttpResponse.body() 返回文件的 Path 对象。
  4. ofString:正文写入字符串并使用 Content-Type 响应标头中指定的字符集进行解码。
  5. ofInputStream:返回一个输入流,可以在接收到正文时从中读取正文。
  6. ofLines:返回一个 Stream。尸体可能还没有收到。
  7. ofPublisher:返回一个发布者,在接收到正文响应字节时可以从中获取它们。发布者只能而且必须订阅一次。

由于端点返回一个字节数组,因此 ofByteArray 方法似乎是一个很好的匹配。文件名是从 Content-Disposition 标头中提取的。代码片段如下所示:

执行程序后,文件将成功下载到指定位置。

可以使用不同的 BodyHandler 来下载文件,如以下几行所示

另一种选择是使用 ofInputStream 方法。

正如您所看到的,有很多选择可以完成工作:-)。

在此用户案例中,已设置两个不同的端点来上传文件。因此,我们将看到不同的方式来使身体发挥作用。请求正文通过提供给 POST 或 PUT 方法之一的 BodyPublisher 提供。BodyPublishers 类提供了许多常见发布者的实现。以下是 BodyPublishers 中可用的一些方法的列表

  1. ofString:返回一个 BodyPublisher,其正文是使用 UTF_8 字符转换的给定字符串。
  2. ofInputStream:从输入流读取数据的主体发布者。
  3. ofByteArray:返回一个请求主体发布者,其主体是给定的字节数组。
  4. ofFile:请求主体发布者,从文件内容中获取数据。
  5. ofByteArrays:请求主体发布者,从字节数组的 Iterable 中获取数据。

现在我们可以继续第一个上传示例。其余端点期望文件内容为字符串。文件类型和名称位于标头中。

如您所见,BodyPublishers.ofFile 方法采用 Path 作为参数。发送请求时,正文将包含文件的内容。

输出

文件被保存到数据库中,并且 URL 会在位置标头中返回以查找它。在第二个示例中,控制器将主体视为字节数组。

ByteArray 方法非常适合这种情况。所需要做的就是将文件的内容转换为字节数组。为此,FileInputStream 将完成这项工作。

输出

最后,为了验证新文件是否存储在数据库中,将调用列表文件端点。

就是这样了。使用 Java 的核心 API 下载和上传文件非常简单。我们必须选择一个合适的正文发布者或正文处理程序来分别发送文件内容和接收文件内容。

关注并回复1即可领取【Java学习资料大礼包】

使用smart-doc自动生成接口文档,解放java开发者

我工作几年,接口文档用过好几种方式了。从最开始的word文档,到后来的swagger和confluence编写接口文档,再到后来侵入性很小的jApiDoc,最后到现在的smart-doc工具。

前面我介绍过一种工具,叫做JApiDocs,这个工具我也使用了一段时间,用起来还是不错的,能满足基本要求,文档链接地址

被写接口文档难受了好久,使用swagger要加各种稀奇古怪的注释,十分繁琐,突然看到JApiDocs 的介绍,只需要在接口上加上点注释,就能够生成接口文档。突然来了希望,通过看文档自己使用之后,把踩过的坑记录下来

文档内容,说明、使用范文很齐全,特别适合我们使用,我会举个例子,大家如果要使用的话,还是抽一两个小时看看官方文档,会有很大帮助,文档地址如下:

smart-doc官方文档地址:https://gitee.com/smart-doc-team/smart-doc/wikis/smart-doc%20maven%E6%8F%92%E4%BB%B6?sort_id=1791450

看着配置很多,大部分时候我们使用默认配置就行了,并且每个配置作者都给加好了注释,一看就懂了

​文档内容如下

只需要表明每个参数的含义,每个方法是干什么的,就能够准确生成接口文档,相比较swagger可是简单多了,然后他有swagger接口测试的替代功能,直接生成能够导入postman的json文件,很方便,后面我会演示。

注意这里的返回类型是list,所以加上了list的泛型

大概就是这样子,现在有很多工具可以生成这种把数据库注释加到代码里面的实体,常见的就是mybatis的generator,还有mybatis-plus的生成实体的方法。

这里不加注释也不会报错,只是生成的字段没了注释,看着很尴尬,如下图,createTime没加注释,虽然也没啥问题,但是不够规范。

双击生成HTML文件,当然也可以生成adoc文件和markdown文件

在smart-doc.json中我配置的存储路径是在:src/main/resources/static/doc

访问debug-all.html,大功告成

​解决:官方文档明确说明对所有的controller都要介绍描述注解,这是因为后台接口代码返回的是BaseResult,没有加上泛型

解决方法:修改baseResult,修改泛型就ok了

必填参数加上@RequestParam注解就行了

生成文档之后是这样的

是不是比swagger用着更爽

强烈推荐大家使用,我们公司通过我的推广,已经用了大半年了,两个字——很爽。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。