Сообщение Mule ESB multipart / form-data не работает

Я пытаюсь опубликовать multipart / form-data с помощью 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 Status 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--

Кажется, не удается добавить расположение содержимого, имя вложения и имя файла.

Я пробовал почти все, читал почти все и не понимал. Любые идеи?


person Julie Russell    schedule 29.12.2016    source источник
comment
Не добавляйте тип контента явно. Для составных данных требуется элемент границы, который будет вычисляться внутри, если тип содержимого еще не установлен. Я подозреваю, что в этом проблема. Попробуйте удалить это.   -  person afelisatti    schedule 29.12.2016
comment
Кроме того, какая это версия мула?   -  person afelisatti    schedule 29.12.2016
comment
К сожалению, это не сработало, я все еще получаю 400. Я использую последнюю версию 3.8.2 EE.   -  person Julie Russell    schedule 30.12.2016
comment
Если вы закомментируете транспорт HTTP, вы увидите, что отправленный запрос возвращается в ответе, как указано выше, без указания содержимого, имени вложения и имени файла и с этими элементами --null. Я попытался добавить имя вложения и имя обработчика данных в качестве содержимого, разницы не было.   -  person Julie Russell    schedule 30.12.2016


Ответы (1)


Решено! Единственное изменение, которое мне пришлось сделать, чтобы он заработал, - это добавить имя файла;

message.addOutboundAttachment("file", AttachmentHelper.getURLAttachment(FilenameUtils.getName(file), file));
person Julie Russell    schedule 30.12.2016