Quarkus中Apache Camel路由处理表单POST请求报InvalidPayloadException如何解决
错误触发原因
当你发送application/x-www-form-urlencoded类型的表单请求时,Apache Camel的platform-http组件会自动将解析后的表单参数封装为HashMap存入消息Body中。而你路由中目标MY_SERVICE对应的是http/https类型的端点,Camel的HTTP生产者在发送POST请求时,默认期望Body是可直接读取的InputStream类型,Camel默认没有提供HashMap到InputStream的内置类型转换器,因此抛出NoTypeConversionAvailableException,最终触发InvalidPayloadException错误。
修复方案
方案1:在路由转发前将表单HashMap转换为符合url编码的字符串
调整路由,在to方法前添加转换步骤即可:rest("/") .get("/v*").to(MY_SERVICE) .post("/v*").convertBodyTo(String.class).to(MY_SERVICE) .put("/v*").convertBodyTo(String.class).to(MY_SERVICE) .delete("/v*").to(MY_SERVICE)Camel内置了表单HashMap转x-www-form-urlencoded格式字符串的转换器,转换为String后HTTP生产者可自动转为InputStream完成发送。
方案2:调整HTTP端点配置,启用表单参数处理
给MY_SERVICE对应的HTTP端点URL添加useRawForm=true参数即可,示例:private static final String MY_SERVICE = "https://你的目标服务地址?bridgeEndpoint=true&useRawForm=true";开启该参数后,Camel HTTP生产者会自动识别HashMap类型的Body为表单参数,自动完成编码和封装,无需额外转换。
方案3:测试时直接发送字符串格式的表单数据
调整测试代码,不用param方法传参,直接传入编码后的表单Body:given().urlEncodingEnabled(true) .body("email_address=user@example.com") .contentType("application/x-www-form-urlencoded") .post("/v3/test");
内容的提问来源于stack exchange,提问作者Romstar
相关产品推荐
相关产品推荐

