在 Mule 4 中通过 HTTP 请求发送 PDF
Sending PDF over HTTP Request in Mule 4
我的流程中有一个 HTTP 请求(例如,DOC 服务),我从服务中获取 PDF,我必须通过另一个 HTTP 请求(例如,OCR 服务)将 PDF 发送到 OCR 应用程序。我从 DOC 服务接收 application/pdf 类型的 PDF,并且 OCR 服务设置为接收 multipart/form-data 类型。
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:ftp="http://www.mulesoft.org/schema/mule/ftp" xmlns:file="http://www.mulesoft.org/schema/mule/file"
xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
<flow name="on-mq-messageFlow" doc:id="eca15aeb-da46-491a-97e1-f73aa5fcd45b" >
<set-payload value='#[%dw 2.0
output application/json
---
read(payload,"application/json")]' doc:name="Set Payload" doc:id="929f7b70-ae47-4fe3-abd2-e89ae092899e" />
<set-variable value="#[payload]" doc:name="Set MQ Payload" doc:id="9716ed4b-4d16-4b9e-8ac8-1dab5646fe0f" variableName="mqPayload"/>
<http:request method="POST" doc:name="Doc Request" doc:id="0e92add3-d576-444d-8070-9d09e6e3c5c5" config-ref="DOC_configuration" path="${doc.request.path}" outputMimeType='multipart/form-data; boundary=----aA1bB2cC3dD4'>
<http:headers ><![CDATA[#[output application/java
---
{
"client-id" : "12345",
"client-secret" : "12345"
}]]]></http:headers>
<http:uri-params ><![CDATA[#[output application/java
---
{
"doc_id" : payload.data.ID
}]]]></http:uri-params>
</http:request>
<http:request method="POST" doc:name="Send Doc to OCR" doc:id="76f60ddb-f570-42be-b85e-ccb2d2ae3703" config-ref="OCR_Request_configuration" path="${ocr.request.path}" outputMimeType="multipart/form-data; boundary=----aA1bB2cC3dD4">
<http:body ><![CDATA[#[%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}]]]></http:body>
<http:headers ><![CDATA[#[output application/java
---
{
"client-id" : "12345",
"Accept" : "*/*",
"client-secret" : "12345",
"Content-Type" : "multipart/form-data; boundary=----aA1bB2cC3dD4"
}]]]></http:headers>
</http:request>
<ee:transform doc:name="Final Response" doc:id="cf68dbc1-cee3-4809-9511-a0794be2b5f7">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{
"status": "Success",
message: "Completed"
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
</mule>
在将负载发送到 OCR 服务之前,我必须在 PDF 文件中添加另一个文本字段。为此,我通过选择 form-data 的部分元素并按照答案 here 中给出的方式修改它,将有效负载定义为 multipart/form-data,但出现以下错误。我还将 DOC 服务和 OCR 服务的 MimeType 设置为 multipart/form-data.
ERROR 2020-12-05 21:57:57,159 [[MuleRuntime].cpuLight.02: [doc-process-api].on-mq-messageFlow.CPU_LITE @6ec62e93] [event: 0e82ca00-3717-11eb-ab69-005056ac6a26] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
********************************************************************************
Message : "javax.mail.internet.ParseException - Missing start boundary, while reading `payload` as MultiPart.
Trace:
at main (Unknown), while writing MultiPart.
Trace:
at main (Unknown)" evaluating expression: "%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
external_id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}".
Element : on-mq-messageFlow/processors/4 @ doc-process-api:on-mq-message.xml:46 (Send Doc to OCR)
Element XML : <http:request method="POST" doc:name="Send Doc to OCR" doc:id="76f60ddb-f570-42be-b85e-ccb2d2ae3703" config-ref="OCR_Request_configuration" path="${ocr.request.path}" outputMimeType="multipart/form-data; boundary=----aA1bB2cC3dD4">
<http:body>#[%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
external_id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}]</http:body>
<http:headers>#[output application/java
---
{
"client-id" : "12345",
"Accept" : "*/*",
"client-secret" : "12345",
"Content-Type" : "multipart/form-data; boundary=----aA1bB2cC3dD4"
}]</http:headers>
</http:request>
Error type : MULE:EXPRESSION
Payload Type : org.mule.runtime.core.internal.streaming.bytes.ManagedCursorStreamProvider
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.runtime.api.el.ExpressionExecutionException: javax.mail.internet.ParseException - Missing start boundary, while reading `payload` as MultiPart.
Trace:
at main (Unknown), while writing MultiPart.
Trace:
at main (Unknown)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.doEvaluate(WeaveExpressionLanguageSession.scala:130)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.evaluate(WeaveExpressionLanguageSession.scala:77)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.evaluate(WeaveExpressionLanguageSession.scala:103)
at org.mule.runtime.core.internal.el.dataweave.DataWeaveExpressionLanguageAdaptor.evaluate(DataWeaveExpressionLanguageAdaptor.java:252)
at org.mule.runtime.core.internal.el.DefaultExpressionManagerSession.evaluate(DefaultExpressionManagerSession.java:38)
at org.mule.runtime.core.privileged.util.attribute.ExpressionAttributeEvaluatorDelegate.resolveExpressionWithSession(ExpressionAttributeEvaluatorDelegate.java:70)
at org.mule.runtime.core.privileged.util.attribute.ExpressionAttributeEvaluatorDelegate.resolve(ExpressionAttributeEvaluatorDelegate.java:56)
at org.mule.runtime.core.privileged.util.AttributeEvaluator.resolveTypedValue(AttributeEvaluator.java:104)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionValueResolver.resolveTypedValue(ExpressionValueResolver.java:122)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionTypedValueValueResolver.resolve(ExpressionTypedValueValueResolver.java:46)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionTypedValueValueResolver.resolve(ExpressionTypedValueValueResolver.java:29)
at org.mule.runtime.module.extension.internal.runtime.resolver.ResolverUtils.resolveRecursively(ResolverUtils.java:90)
at org.mule.runtime.module.extension.internal.runtime.resolver.ResolverSet.resolve(ResolverSet.java:109)
at org.mule.runtime.module.extension.internal.runtime.operation.ComponentMessageProcessor.getResolutionResult(ComponentMessageProcessor.java:586)
at org.mule.runtime.module.extension.internal.runtime.operation.ComponentMessageProcessor.lambda$apply(ComponentMessageProcessor.java:194)
at org.mule.runtime.core.api.util.func.CheckedFunction.apply(CheckedFunction.java:19)
at org.mule.runtime.core.api.rx.Exceptions.lambda$checkedFunction(Exceptions.java:84)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:381)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmit(FluxFlatMap.java:532)
at reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:974)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2071)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)
at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:964)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)
at reactor.core.publisher.MonoCurrentContext.subscribe(MonoCurrentContext.java:35)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.Mono.subscribe(Mono.java:3858)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:420)
at org.mule.runtime.core.privileged.processor.chain.AbstractMessageProcessorChain.onNext(AbstractMessageProcessorChain.java:292)
at org.mule.runtime.core.privileged.processor.chain.AbstractMessageProcessorChain.onNext(AbstractMessageProcessorChain.java:285)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:204)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:345)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:204)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:111)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:109)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.tryOnNext(FluxMapFuseable.java:303)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:109)
at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.runAsync(FluxPublishOn.java:866)
at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.run(FluxPublishOn.java:939)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.mule.service.scheduler.internal.AbstractRunnableFutureDecorator.doRun(AbstractRunnableFutureDecorator.java:111)
at org.mule.service.scheduler.internal.RunnableFutureDecorator.run(RunnableFutureDecorator.java:54)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
为了解决这个问题,我尝试在 headers 中添加边界,如下所示 Content-Type,但仍然出现相同的错误。
"Content-Type: "multipart/form-data; boundary=----aA1bB2cC3dD4"
这里我不需要解析任何东西,只是将PDF从一个服务移交给另一个服务,只是增加了一个额外的字段。我怎样才能做到这一点?感谢任何帮助。
发生错误是因为您没有将 DOC 服务键入为多部分,因此 DataWeave 会尝试读取 PDF。 mime 类型参数影响你操作的输出,说“这是我生产的类型”。但在 HTTP 的情况下,这是根据“Content-Type”自动确定的 header,您无需为 ORC 服务指定超出 DataWeave 转换的 mime 类型。
我接受了@afelisatti 的回答,因为这是帮助我修复我遇到的错误的关键点;我在这里发布我如何能够在 Mule 4 中通过 HTTP 请求发送 PDF。
- 删除了我为 OCR 服务 HTTP 请求设置的输出 mime 类型并将输出 mime 类型设置为 application/pdf
- 在设置负载中设置来自 DOC 服务 (PDF) 的输出负载
- 取出我在 OCR HTTP 请求中定义的有效载荷,并将其放入如下所示的转换消息中,并进行一些更改。变化是;添加边界和输出类型,将 'Content Disposition' 中的文档设置为文件名。
<ee:transform doc:name="Multipart Payload with ID" doc:id="cf68dbc1-cee3-4809-9511-a0794be2b5f7">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
import * from dw::module::Multipart
output multipart/form-data; boundary=----aA1bB2cC3dD4"
---
{
parts: {
file: {
headers: {
"Content-Disposition": {
"name": "file",
"filename": vars.mqPayload.data.ID ++ "_Doc.pdf" as String
},
"Content-Type": "application/pdf"
},
content: payload
},
id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
- 在 OCR HTTP 请求
中为 muiltpart/form-data Content-Type header 添加了边界和字符集
"Content-Type":"multipart/form-data; charset=UTF-8; boundary=----aA1bB2cC3dD4"
重要的是在HTTP请求headers中设置边界和字符集,并且在formdata payload中定义相同的边界,否则会导致边界不匹配的错误请求。
我的流程中有一个 HTTP 请求(例如,DOC 服务),我从服务中获取 PDF,我必须通过另一个 HTTP 请求(例如,OCR 服务)将 PDF 发送到 OCR 应用程序。我从 DOC 服务接收 application/pdf 类型的 PDF,并且 OCR 服务设置为接收 multipart/form-data 类型。
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:ftp="http://www.mulesoft.org/schema/mule/ftp" xmlns:file="http://www.mulesoft.org/schema/mule/file"
xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
<flow name="on-mq-messageFlow" doc:id="eca15aeb-da46-491a-97e1-f73aa5fcd45b" >
<set-payload value='#[%dw 2.0
output application/json
---
read(payload,"application/json")]' doc:name="Set Payload" doc:id="929f7b70-ae47-4fe3-abd2-e89ae092899e" />
<set-variable value="#[payload]" doc:name="Set MQ Payload" doc:id="9716ed4b-4d16-4b9e-8ac8-1dab5646fe0f" variableName="mqPayload"/>
<http:request method="POST" doc:name="Doc Request" doc:id="0e92add3-d576-444d-8070-9d09e6e3c5c5" config-ref="DOC_configuration" path="${doc.request.path}" outputMimeType='multipart/form-data; boundary=----aA1bB2cC3dD4'>
<http:headers ><![CDATA[#[output application/java
---
{
"client-id" : "12345",
"client-secret" : "12345"
}]]]></http:headers>
<http:uri-params ><![CDATA[#[output application/java
---
{
"doc_id" : payload.data.ID
}]]]></http:uri-params>
</http:request>
<http:request method="POST" doc:name="Send Doc to OCR" doc:id="76f60ddb-f570-42be-b85e-ccb2d2ae3703" config-ref="OCR_Request_configuration" path="${ocr.request.path}" outputMimeType="multipart/form-data; boundary=----aA1bB2cC3dD4">
<http:body ><![CDATA[#[%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}]]]></http:body>
<http:headers ><![CDATA[#[output application/java
---
{
"client-id" : "12345",
"Accept" : "*/*",
"client-secret" : "12345",
"Content-Type" : "multipart/form-data; boundary=----aA1bB2cC3dD4"
}]]]></http:headers>
</http:request>
<ee:transform doc:name="Final Response" doc:id="cf68dbc1-cee3-4809-9511-a0794be2b5f7">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{
"status": "Success",
message: "Completed"
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
</mule>
在将负载发送到 OCR 服务之前,我必须在 PDF 文件中添加另一个文本字段。为此,我通过选择 form-data 的部分元素并按照答案 here 中给出的方式修改它,将有效负载定义为 multipart/form-data,但出现以下错误。我还将 DOC 服务和 OCR 服务的 MimeType 设置为 multipart/form-data.
ERROR 2020-12-05 21:57:57,159 [[MuleRuntime].cpuLight.02: [doc-process-api].on-mq-messageFlow.CPU_LITE @6ec62e93] [event: 0e82ca00-3717-11eb-ab69-005056ac6a26] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
********************************************************************************
Message : "javax.mail.internet.ParseException - Missing start boundary, while reading `payload` as MultiPart.
Trace:
at main (Unknown), while writing MultiPart.
Trace:
at main (Unknown)" evaluating expression: "%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
external_id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}".
Element : on-mq-messageFlow/processors/4 @ doc-process-api:on-mq-message.xml:46 (Send Doc to OCR)
Element XML : <http:request method="POST" doc:name="Send Doc to OCR" doc:id="76f60ddb-f570-42be-b85e-ccb2d2ae3703" config-ref="OCR_Request_configuration" path="${ocr.request.path}" outputMimeType="multipart/form-data; boundary=----aA1bB2cC3dD4">
<http:body>#[%dw 2.0
output multipart/form-data
---
{
parts: {
file: {
headers: {
"Content-Type": payload.^mimeType
},
content: payload
},
external_id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}]</http:body>
<http:headers>#[output application/java
---
{
"client-id" : "12345",
"Accept" : "*/*",
"client-secret" : "12345",
"Content-Type" : "multipart/form-data; boundary=----aA1bB2cC3dD4"
}]</http:headers>
</http:request>
Error type : MULE:EXPRESSION
Payload Type : org.mule.runtime.core.internal.streaming.bytes.ManagedCursorStreamProvider
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.runtime.api.el.ExpressionExecutionException: javax.mail.internet.ParseException - Missing start boundary, while reading `payload` as MultiPart.
Trace:
at main (Unknown), while writing MultiPart.
Trace:
at main (Unknown)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.doEvaluate(WeaveExpressionLanguageSession.scala:130)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.evaluate(WeaveExpressionLanguageSession.scala:77)
at org.mule.weave.v2.el.WeaveExpressionLanguageSession.evaluate(WeaveExpressionLanguageSession.scala:103)
at org.mule.runtime.core.internal.el.dataweave.DataWeaveExpressionLanguageAdaptor.evaluate(DataWeaveExpressionLanguageAdaptor.java:252)
at org.mule.runtime.core.internal.el.DefaultExpressionManagerSession.evaluate(DefaultExpressionManagerSession.java:38)
at org.mule.runtime.core.privileged.util.attribute.ExpressionAttributeEvaluatorDelegate.resolveExpressionWithSession(ExpressionAttributeEvaluatorDelegate.java:70)
at org.mule.runtime.core.privileged.util.attribute.ExpressionAttributeEvaluatorDelegate.resolve(ExpressionAttributeEvaluatorDelegate.java:56)
at org.mule.runtime.core.privileged.util.AttributeEvaluator.resolveTypedValue(AttributeEvaluator.java:104)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionValueResolver.resolveTypedValue(ExpressionValueResolver.java:122)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionTypedValueValueResolver.resolve(ExpressionTypedValueValueResolver.java:46)
at org.mule.runtime.module.extension.internal.runtime.resolver.ExpressionTypedValueValueResolver.resolve(ExpressionTypedValueValueResolver.java:29)
at org.mule.runtime.module.extension.internal.runtime.resolver.ResolverUtils.resolveRecursively(ResolverUtils.java:90)
at org.mule.runtime.module.extension.internal.runtime.resolver.ResolverSet.resolve(ResolverSet.java:109)
at org.mule.runtime.module.extension.internal.runtime.operation.ComponentMessageProcessor.getResolutionResult(ComponentMessageProcessor.java:586)
at org.mule.runtime.module.extension.internal.runtime.operation.ComponentMessageProcessor.lambda$apply(ComponentMessageProcessor.java:194)
at org.mule.runtime.core.api.util.func.CheckedFunction.apply(CheckedFunction.java:19)
at org.mule.runtime.core.api.rx.Exceptions.lambda$checkedFunction(Exceptions.java:84)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:381)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmit(FluxFlatMap.java:532)
at reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:974)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2071)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)
at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:964)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)
at reactor.core.publisher.MonoCurrentContext.subscribe(MonoCurrentContext.java:35)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.Mono.subscribe(Mono.java:3858)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:420)
at org.mule.runtime.core.privileged.processor.chain.AbstractMessageProcessorChain.onNext(AbstractMessageProcessorChain.java:292)
at org.mule.runtime.core.privileged.processor.chain.AbstractMessageProcessorChain.onNext(AbstractMessageProcessorChain.java:285)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:204)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:345)
at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:204)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:111)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:109)
at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.tryOnNext(FluxMapFuseable.java:303)
at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.tryOnNext(FluxContextStart.java:109)
at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.runAsync(FluxPublishOn.java:866)
at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.run(FluxPublishOn.java:939)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.mule.service.scheduler.internal.AbstractRunnableFutureDecorator.doRun(AbstractRunnableFutureDecorator.java:111)
at org.mule.service.scheduler.internal.RunnableFutureDecorator.run(RunnableFutureDecorator.java:54)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
为了解决这个问题,我尝试在 headers 中添加边界,如下所示 Content-Type,但仍然出现相同的错误。
"Content-Type: "multipart/form-data; boundary=----aA1bB2cC3dD4"
这里我不需要解析任何东西,只是将PDF从一个服务移交给另一个服务,只是增加了一个额外的字段。我怎样才能做到这一点?感谢任何帮助。
发生错误是因为您没有将 DOC 服务键入为多部分,因此 DataWeave 会尝试读取 PDF。 mime 类型参数影响你操作的输出,说“这是我生产的类型”。但在 HTTP 的情况下,这是根据“Content-Type”自动确定的 header,您无需为 ORC 服务指定超出 DataWeave 转换的 mime 类型。
我接受了@afelisatti 的回答,因为这是帮助我修复我遇到的错误的关键点;我在这里发布我如何能够在 Mule 4 中通过 HTTP 请求发送 PDF。
- 删除了我为 OCR 服务 HTTP 请求设置的输出 mime 类型并将输出 mime 类型设置为 application/pdf
- 在设置负载中设置来自 DOC 服务 (PDF) 的输出负载
- 取出我在 OCR HTTP 请求中定义的有效载荷,并将其放入如下所示的转换消息中,并进行一些更改。变化是;添加边界和输出类型,将 'Content Disposition' 中的文档设置为文件名。
<ee:transform doc:name="Multipart Payload with ID" doc:id="cf68dbc1-cee3-4809-9511-a0794be2b5f7">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
import * from dw::module::Multipart
output multipart/form-data; boundary=----aA1bB2cC3dD4"
---
{
parts: {
file: {
headers: {
"Content-Disposition": {
"name": "file",
"filename": vars.mqPayload.data.ID ++ "_Doc.pdf" as String
},
"Content-Type": "application/pdf"
},
content: payload
},
id: {
headers: {
"Content-Type": "text/plain"
},
content: vars.mqPayload.data.ID
}
}
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
- 在 OCR HTTP 请求 中为 muiltpart/form-data Content-Type header 添加了边界和字符集
"Content-Type":"multipart/form-data; charset=UTF-8; boundary=----aA1bB2cC3dD4"
重要的是在HTTP请求headers中设置边界和字符集,并且在formdata payload中定义相同的边界,否则会导致边界不匹配的错误请求。