使用 Citrus 框架接收 HTTP Post 请求中的 PDF 并写入文件

使用 citrus 框架接收 http post 请求中的 pdf 并写入文件

本文档旨在指导开发者在使用 Citrus 框架时,如何正确接收 HTTP Post 请求中返回的 PDF 文件,并将其保存到本地。重点在于避免常见的编码问题,并提供一种简洁高效的文件写入方法。同时,介绍了一种自定义的 HttpClient,方便处理 HTTP 请求中的二进制数据。

在使用 Citrus 框架进行集成测试时,接收 HTTP Post 请求返回的 PDF 文件并将其写入文件是一个常见的需求。如果直接将接收到的 Payload 作为对象进行序列化,可能会导致文件内容为空。正确的做法是直接将 PDF 文件的字节数组写入文件。

以下是如何在 Citrus 中接收 PDF 文件并将其写入文件的步骤:

接收 PDF 文件:

使用 Citrus 的 http 方法接收 HTTP 响应,并确保指定正确的 contentType 为 MediaType.APPLICATION_PDF_VALUE。

runner.http(httpActionBuilder -> httpActionBuilder        .client(vdeClient)        .receive()        .response(HttpStatus.OK)        .contentType(MediaType.APPLICATION_PDF_VALUE)    );

获取 Payload:

从消息存储中获取消息,并获取其 Payload。此时的 Payload 应该是 PDF 文件的字节数组。

Object pdfPayload = context.getMessageStore().getMessage("nameOfTheMessage").getPayload();

将 Payload 转换为字节数组:

如果 pdfPayload 已经是字节数组 (byte[]) 类型,则可以直接使用。如果不是,可能需要进行类型转换。 确保正确处理可能出现的类型转换异常。

byte[] pdfBytes = (byte[]) pdfPayload;

将字节数组写入文件:

使用 Files.write 方法将字节数组直接写入 PDF 文件。避免使用 ObjectOutputStream 进行序列化,因为这可能会导致文件内容为空。

try {    Files.write(Paths.get("path/to/your/file.pdf"), pdfBytes);} catch (IOException e) {    e.printStackTrace(); // 错误处理}

示例代码:

import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.core.io.FileSystemResource;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;import org.testng.annotations.Test;public class PdfHandlingTest extends TestNGCitrusTestRunner {    @Test    public void testReceiveAndWritePdf() {        String pdfFileName = "received.pdf";        // 发送请求并接收PDF响应        http(httpActionBuilder -> httpActionBuilder                .client("vdeClient")                .send()                .post("/generatePdf")                .payload(new FileSystemResource("src/test/resources/payload.xml")) // 假设有一个payload.xml文件                .contentType(MediaType.APPLICATION_XML_VALUE));        http(httpActionBuilder -> httpActionBuilder                .client("vdeClient")                .receive()                .response(HttpStatus.OK)                .contentType(MediaType.APPLICATION_PDF_VALUE)                .name("pdfResponse"));        // 获取Payload并写入文件        receive(receiveBuilder -> receiveBuilder                .message(context -> {                    byte[] pdfBytes = (byte[]) context.getMessageStore().getMessage("pdfResponse").getPayload();                    try {                        Files.write(Paths.get(pdfFileName), pdfBytes);                    } catch (IOException e) {                        e.printStackTrace();                    }                    return null;                }));    }}

注意事项:

确保在 http 方法中设置了正确的 contentType,以便 Citrus 正确解析响应。直接使用 Files.write 方法将字节数组写入文件,避免使用 ObjectOutputStream。进行适当的错误处理,例如捕获 IOException 异常。vdeClient需要在Citrus上下文中正确配置。根据实际情况替换示例代码中的文件名和路径。

自定义 HttpClient (可选):

如果需要更灵活地处理 HTTP 请求,可以考虑使用自定义的 HttpClient。 例如 MgntUtils 库提供的 HttpClient。

import com.mgnt.lifecycle.management.httpclient.HttpClient;import com.mgnt.utils.TextUtils;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Files;import java.nio.file.Paths;public class HttpClientExample {    public static void downloadFile() {        HttpClient httpClient = new HttpClient();        httpClient.setRequestHeader("Accept", "application/octet-stream");        httpClient.setConnectionUrl("https://dl.k8s.io/release/v1.20.0//bin/linux/amd64/kubectl");        ByteBuffer buffer = null;        try {            buffer = httpClient.sendHttpRequestForBinaryResponse(HttpClient.HttpMethod.GET);            System.out.println(httpClient.getLastResponseCode() + " " + httpClient.getLastResponseMessage());        } catch (IOException ioe) {            System.out.println(httpClient.getLastResponseCode() + " " + httpClient.getLastResponseMessage());            System.out.println(TextUtils.getStacktrace(ioe, "com.mgnt.stam."));        }        try {            Files.write(Paths.get("C:MichaelworkInstallationsKuberneteskubectl"), buffer.array());        } catch (IOException e) {            System.out.println(TextUtils.getStacktrace(e, "com.mgnt.stam."));        }    }}

总结:

通过以上步骤,您可以在 Citrus 框架中正确接收 HTTP Post 请求返回的 PDF 文件,并将其保存到本地。 关键在于正确处理 Payload,并使用 Files.write 方法直接写入字节数组。 如果需要更灵活地处理 HTTP 请求,可以考虑使用自定义的 HttpClient。

以上就是使用 Citrus 框架接收 HTTP Post 请求中的 PDF 并写入文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/137794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LINUX怎么把程序放到后台运行_LINUX后台运行程序的多种方式
上一篇 2025年11月30日 10:37:03
免费PPT如何导出高清文件_免费工具导出高清PPT的方法
下一篇 2025年11月30日 10:41:07

相关推荐

  • 如何在将安全组的网络类型更换为专有网络之后克隆安全组

    本篇文章给大家带来的内容是关于如何在将安全组的网络类型更换为专有网络之后克隆安全组,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 克隆安全组 阿里云支持您跨地域、跨网络类型克隆安全组。 应用场景 在下列场景里您可能需要克隆安全组: 假设您已经在地域 A 里创建了一个安全组 SG1,…

    2026年9月2日
    000
  • 关于ECS 实例中常用的15个端口介绍

    本篇文章给大家带来的内容是关于ecs 实例中常用的15个端口介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ECS 实例常用端口介绍 以下为 ECS 实例常用端口列表: 无法访问某些端口 现象:ECS 实例监听了对应端口,但这个端口在部分地区无法访问,而其它端口访问正常的情况。…

    2026年9月2日
    000
  • 如何在Linux 实例中创建 SSH 密钥对

    本篇文章给大家带来的内容是关于如何在linux 实例中创建 ssh 密钥对,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 创建 SSH 密钥对 使用限制 SSH 密钥对,简称密钥对,仅支持 Linux 实例。 目前,阿里云只支持创建 2048 位的 RSA 密钥对。 阿里云会保存密…

    2026年9月2日
    000
  • VSCode的代码怎么运行_VSCode多语言代码执行方法与配置教程

    VSCode通过调用系统已安装的语言运行时来运行代码,需先安装对应语言环境,再结合扩展、集成终端或配置文件实现执行。 VSCode运行代码,说白了,它自己其实不“运行”代码,它更像是一个极其智能的遥控器和指挥中心。它利用你系统里已经安装好的各种语言运行时、编译器或解释器来完成这个任务。核心思路就是:…

    2026年9月2日
    100
  • 如何在ECS管理控制台上导入 SSH 密钥对

    本篇文章给大家带来的内容是关于如何在ecs管理控制台上导入 ssh 密钥对,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 导入 SSH 密钥对 您可以使用其他工具生成 RSA 密钥对,并将公钥部分导入阿里云,导入的密钥应支持的加密方式请参考 SSH 密钥对。 说明 请妥善保存密钥对…

    2026年9月2日
    000
  • 在ECS管理控制台上如何绑定和解绑 SSH 密钥对

    本文在介绍在ecs管理控制台上如何绑定和解绑 ssh 密钥对的基础上,重点探讨了其具体步骤。 绑定和解绑 SSH 密钥对 使用限制 一台 ECS 实例只能绑定一个 SSH 密钥对。 除系列 I 的非 I/O 优化实例外,所有 实例规格族 的 Linux 实例均支持 SSH 密钥对登录。 如果 ECS…

    2026年9月2日
    300
  • 如何在ECS实例中创建云助手命令

    本篇文章给大家带来的内容是关于如何在ecs实例中创建云助手命令,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 创建命令 云助手命令可以在ECS实例中快速完成运行自动化运维脚本、轮询进程、重置用户密码、安装或者卸载软件、更新应用以及安装补丁等一些日常任务。命令类型可以是Windows…

    2026年9月2日
    000
  • 创建云助手命令后如何在一台或者多台实例中执行命令

    本篇文章给大家带来的内容是关于创建云助手命令后如何在一台或者多台实例中执行命令,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 执行命令 创建云助手命令后,您可以在一台或者多台实例中执行命令。多台实例间的执行状态和执行结果互相不影响,您还可以为命令设置执行周期。 使用限制 在一个阿里…

    2026年9月2日
    000
  • 创建了云助手命令后如何合理管理自己的命令资源

    本篇文章给大家带来的内容是关于创建了云助手命令后如何合理管理自己的命令资源,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 管理命令 创建了云助手命令后,建议您合理管理自己的命令资源。您可以重新修改命令名称和描述、克隆命令或者删除不再需要的命令以确保命令额度不超过使用限制。 修改命令…

    2026年9月2日
    100
  • 关于在创建ECS实例时附加弹性网卡的注意事项

    本篇文章给大家带来的内容是关于关于在创建ecs实例时附加弹性网卡的注意事项,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在创建实例时附加弹性网卡 在ECS控制台上,在创建ECS实例时,您可以附加弹性网卡(ENI)。创建实例的具体操作与说明,请参见 步骤 2:创建ECS实例。本文主…

    用户投稿 2026年9月2日
    100
  • 如何在创建实例时附加弹性网卡

    本篇文章给大家带来的内容是关于如何在创建实例时附加弹性网卡,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 创建弹性网卡 您可以通过以下2种方式创建弹性网卡: 在创建实例时附加弹性网卡。通过这种方式最多只能附加2块弹性网卡,一块为主网卡,一块为辅助网卡。通过这种方式创建的辅助网卡,如…

    用户投稿 2026年9月2日
    100
  • Linux如何进行网络排错_Linux网络排错的实用技巧

    先检查网络接口状态,使用ip addr确认网卡UP及IP分配;再通过ping测试本地、网关和外网连通性;接着查看ip route中默认路由是否配置;然后排查DNS解析问题,检查/etc/resolv.conf并用dig测试;最后用ss或netstat确认端口监听,结合tcpdump抓包分析,按物理连…

    2026年9月2日
    100
  • 在控制台上如何将弹性网卡附加到时实例上

    本文在介绍在控制台上如何将弹性网卡附加到时实例上的基础上,重点探讨了其具体步骤,本文内容很紧凑,希望大家耐心学习。 将弹性网卡附加到实例 您可以将弹性网卡附加到实例上,但仅限于辅助网卡。 本文描述了如何在控制台上将弹性网卡附加到时实例上。 限制 附加弹性网卡到ECS实例上时,有以下限制: 仅限于辅助…

    用户投稿 2026年9月2日
    100
  • VSCode怎么侧边显示函数_VSCode大纲视图侧边栏函数列表教程

    最直接的方式是启用VSCode的“大纲视图”功能,它能清晰列出文件中的函数、类等符号,支持快速导航与筛选,提升代码阅读与重构效率。 VSCode中想要在侧边栏看到函数列表,最直接、也是我个人觉得效率最高的方式,就是利用它的“大纲视图”(Outline View)。这个功能就像给你的代码文件画了一张清…

    2026年9月2日
    100
  • 适用于刚接触云计算的自行搭建网站流程

    本篇文章给大家带来的内容是关于适用于刚接触云计算的自行搭建网站流程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 零基础入门—网站建站教程 前言 相信很多新用户会有这样的疑惑,我要做个网站,到底要使用什么产品,如何能快速完成网站建站呢?搭建网站有两种选择,一种是直接购买建站模板,另…

    2026年9月2日
    200
  • 如何使用资源编排服务(ROS)一键在ECS实例搭建LNMP环境

    如何使用资源编排服务(ROS)一键在ECS实例搭建LNMP环境如何使用资源编排服务(ROS)一键在ECS实例搭建LNMP环境如何使用资源编排服务(ROS)一键在ECS实例搭建LNMP环境如何使用资源编排服务(ROS)一键在ECS实例搭建LNMP环境

    本篇文章给大家带来的内容是关于如何使用资源编排服务(ros)一键在ecs实例搭建lnmp环境,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一键部署LNMP环境 LNMP分别代表Linux、Nginx、MySQL、PHP。本文介绍如何使用阿里云 资源编排服务(ROS) 一键在ECS…

    2026年9月2日 用户投稿
    100
  • 如何使用镜像部署Java Web项目

    如何使用镜像部署Java Web项目如何使用镜像部署Java Web项目如何使用镜像部署Java Web项目如何使用镜像部署Java Web项目

    本篇文章给大家带来的内容是关于如何使用镜像部署java web项目,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 镜像部署Java Web项目 Tomcat 作为一个开源且免费的 Java Web 服务器,常用来作为 Web 开发的工具。它可以托管由 Servlet、JSP 页面(…

    2026年9月2日 用户投稿
    100
  • 如何使用一台基本配置的云服务器 ECS 实例手工部署 Java web 项目

    本篇文章给大家带来的内容是关于如何使用一台基本配置的云服务器 ecs 实例手工部署 java web 项目,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 手工部署Java Web项目 适用对象 本文档介绍如何使用一台基本配置的云服务器 ECS 实例部署 Java web 项目。适用…

    2026年9月2日
    200
  • 如何创建基于ECS和RDS的WordPress环境

    如何创建基于ECS和RDS的WordPress环境如何创建基于ECS和RDS的WordPress环境如何创建基于ECS和RDS的WordPress环境如何创建基于ECS和RDS的WordPress环境

    本文在介绍如何创建基于ecs和rds的wordpress环境的基础上,重点探讨了其具体步骤,本文内容很紧凑,希望大家耐心学习。 创建基于ECS和RDS的WordPress环境 您可以在资源编排服务ROS (Resource Orchestration Service)中通过模版创建一组阿里云资源。 …

    2026年9月2日 用户投稿
    100
  • 如何在Linux实例上搭建Magento电子商务网站

    本篇文章给大家带来的内容是关于如何在linux实例上搭建magento电子商务网站,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在Linux实例上搭建Magento电子商务网站 Magento是一款开源电商网站框架,其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。它使…

    2026年9月2日
    000

发表回复

登录后才能评论
关注微信