0

0

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

聖光之護

聖光之護

发布时间:2025-07-11 16:50:39

|

1013人浏览过

|

来源于php中文网

原创

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

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

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

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

  1. 接收 PDF 文件:

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

    runner.http(httpActionBuilder -> httpActionBuilder
            .client(vdeClient)
            .receive()
            .response(HttpStatus.OK)
            .contentType(MediaType.APPLICATION_PDF_VALUE)
        );
  2. 获取 Payload:

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

    Object pdfPayload = context.getMessageStore().getMessage("nameOfTheMessage").getPayload();
  3. 将 Payload 转换为字节数组:

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

    故事AI绘图神器
    故事AI绘图神器

    文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

    下载
    byte[] pdfBytes = (byte[]) pdfPayload;
  4. 将字节数组写入文件:

    使用 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:\\Michael\\work\\Installations\\Kubernetes\\kubectl"), buffer.array());
        } catch (IOException e) {
            System.out.println(TextUtils.getStacktrace(e, "com.mgnt.stam."));
        }
    }
}

总结:

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

相关专题

更多
C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

299

2025.07.15

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

374

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

412

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1972

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1998

2024.08.16

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

9

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

59

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

82

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

38

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号