在Mule 4中通过HTTP请求发送PDF

在Mule 4中通过HTTP请求发送PDF,mule,multipartform-data,dataweave,mule4,Mule,Multipartform Data,Dataweave,Mule4,在我的流程中有一个HTTP请求(比如说,文档服务),我从一个服务中获得一个PDF,我必须通过另一个HTTP请求(比如,OCR服务)将PDF发送到OCR应用程序。我从DOC服务接收的PDF是application/PDF类型,OCR服务设置为接收multipart/form数据类型 <?xml version="1.0" encoding="UTF-8"?> <mule xmlns:ftp="http://www.mulesof

在我的流程中有一个HTTP请求(比如说,文档服务),我从一个服务中获得一个PDF,我必须通过另一个HTTP请求(比如,OCR服务)将PDF发送到OCR应用程序。我从DOC服务接收的PDF是application/PDF类型,OCR服务设置为接收multipart/form数据类型

<?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>

在这里,我不需要解析任何内容,只需将PDF从一个服务切换到另一个服务,只需添加一个额外的字段。我怎样才能做到这一点?非常感谢您的帮助。

发生此错误是因为您未将文档服务键入为multipart,因此DataWeave会尝试读取PDF。mime type参数影响操作的输出,表示“这是我生成的类型”。但是在HTTP的情况下,它是根据“Content Type”头自动确定的,您不需要为ORC服务指定DataWeave转换之外的mime类型。

我接受@afelisatti的回答,因为这是帮助我修复错误的关键点;我在这里发布我是如何在Mule 4中通过HTTP请求发送PDF的

  • 删除了为OCR服务HTTP请求设置的输出mime类型,并将输出mime类型设置为application/pdf
  • 在Set payload(设置有效负载)中设置来自文档服务(PDF)的输出有效负载
  • 取出我在OCR HTTP请求中定义的有效负载,并将其放入下面这样的转换消息中,并进行了一些更改。这些变化是:;添加了边界和输出类型,将“内容处置”中文档的文件名设置为文件名

  • 重要的是在HTTP请求头中设置边界和字符集,并且在formdata负载中定义了相同的边界,否则将导致边界不匹配的错误请求。

    请添加流的XML以准确了解其作用,并请编辑错误消息以将其完全粘贴。它是可信的,我们可能会错过详细信息。通过添加XML和错误堆栈traceThanks更新了我的问题,@afelisati,我已从文档服务中删除mime类型,它现在发出了错误的请求。我可以直接访问该服务,但不能通过为其创建的系统API。我通过添加XML和错误堆栈跟踪更新了我的问题。错误堆栈跟踪看起来和以前一样,不是一条错误的请求消息。你能更新一下吗?最好的。解决错误请求错误的方法是启用HTTP中的有线记录来检查发送的实际HTTP消息,然后使用其他工具(如curl)将其与正确请求进行比较。谢谢,@afelisatti。很抱歉反应太晚,这帮我解决了问题,我也解决了。我已经发布了一个详细的答案,说明我是如何通过HTTP请求发送pdf的,当您没有在转换上指定边界以及HTTP头时发生了什么?好吧,它应该会自动为您生成一个。
    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$1.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$6(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$2(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$1.onNext(AbstractMessageProcessorChain.java:292)
        at org.mule.runtime.core.privileged.processor.chain.AbstractMessageProcessorChain$1.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)
    
    
    "Content-Type: "multipart/form-data; boundary=----aA1bB2cC3dD4"
    
    <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>
    
    "Content-Type":"multipart/form-data; charset=UTF-8; boundary=----aA1bB2cC3dD4"