【问题标题】:Mule ESB multipart/form-data post not workingMule ESB 多部分/表单数据帖子不起作用
【发布时间】:2016-12-31 05:17:22
【问题描述】:

我正在尝试使用 Mule ESB 发布多部分/表单数据,但无法使其正常工作。我通过我的休息客户端和 cURL 成功完成了相同的请求。

curl -i -X POST \
-H "Authorization:bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "X-ANYPNT-ORG-ID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "X-ANYPNT-ENV-ID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Content-Type:multipart/form-data" \
-F "artifactName=test" \
-F "targetId=xxxxxx" \
-F "file=@\"./test-1.0.0-SNAPSHOT.zip\";type=application/x-zip-compressed;filename=\"test-1.0.0-SNAPSHOT.zip\"" \ 'https://anypoint.mulesoft.com/hybrid/api/v1/applications'

我正在使用 Transformer 添加出站附件;

message.setPayload(NullPayload.getInstance());
message.addOutboundAttachment("artifactName", AttachmentHelper.getStringAttachment("artifactName", artifactName));
message.addOutboundAttachment("targetId", AttachmentHelper.getStringAttachment("targetId", targetId.toString()));
message.addOutboundAttachment("file", AttachmentHelper.getURLAttachment("file", file));

public class AttachmentHelper {
  public static DataHandler getStringAttachment(String name, String value) {
    logger.info("Adding string attachment " + name + ": " + value);
    byte[] bytes = value.getBytes();
    return new DataHandler(new ByteArrayDataSource(bytes, "text/plain", name));
  }

  public static DataHandler getURLAttachment(String name, String value) throws Exception {
    InputStream is = new URL(value).openStream();
    byte[] bytes = IOUtils.toByteArray(is);
    return new DataHandler(new ByteArrayDataSource(bytes, "application/x-zip-compressed", name));
  }
}

然后只是进行服务调用;

<http:request method="POST" path="/hybrid/api/v1/applications" config-ref="http_request_mule" doc:name="POST Deploy Application Call">
        <http:request-builder>
            <http:header headerName="Authorization" value="bearer #[sessionVars.token]" />
            <http:header headerName="X-ANYPNT-ORG-ID" value="#[sessionVars.orgId]" />
            <http:header headerName="X-ANYPNT-ENV-ID" value="#[sessionVars.envId]" />
            <http:header headerName="Content-Type" value="multipart/form-data" />
        </http:request-builder>
    </http:request>

我收到了 HTTP 状态 400,当我注释掉 HTTP 调用时,我可以看到请求的格式不正确;

Unexpected character (-) at position 0.
--null
Content-Type: application/x-zip-compressed

C:\DEV\zips\test-1.0.0-SNAPSHOT.zip (byte content removed for post)
--null
Content-Type: text/plain

xxxxxx (value correct here just masked)
--null
Content-Type: text/plain

test
--null--

似乎无法添加内容配置、附件名称和文件名。

我几乎尝试了所有内容并阅读了所有内容,但我不知所措。有什么想法吗?

【问题讨论】:

  • 不要显式添加内容类型。多部分数据需要在内部计算的边界元素,除非已经设置了内容类型。我怀疑这是问题所在。尝试删除它。
  • 还有,这是哪个mule版本?
  • 不幸的是,这不起作用,我仍然得到 400。我使用的是最新的 3.8.2 EE。
  • 如果您注释掉 HTTP 传输,您可以看到发送的请求在响应中返回,并且如上所示,缺少内容配置、附件名称和文件名,并且具有那些 --null 元素.我尝试将附件名称和数据处理程序名称添加为内容处置,它没有显示任何区别。

标签: mule multipartform-data mule-esb


【解决方案1】:

解决了!我必须做的唯一改变是添加文件名;

message.addOutboundAttachment("file", AttachmentHelper.getURLAttachment(FilenameUtils.getName(file), file));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2014-11-02
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多