2016-12-29 3 views
0

Я пытаюсь отправить многочастные/формальные данные с помощью Mule ESB, но не могу заставить его работать. У меня есть тот же запрос, который успешно работает через моего клиента-клиента и cURL.Mule ESB multipart/form-data post не работает

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 "[email protected]\"./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' 

Я использую трансформатор для добавления исходящих вложений;

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

Похоже, что не удалось добавить содержимое, имя вложения и имя файла.

Я пробовал практически все и прочитал обо всем, и я в растерянности. Есть идеи?

+0

Не указывайте тип содержимого явно. Для многостраничных данных требуется элемент границы, который будет вычисляться внутренне, если только тип контента уже не установлен. Я подозреваю, что это проблема. Попробуйте удалить это. – afelisatti

+0

Кроме того, какая версия мула это? – afelisatti

+0

К сожалению, это не сработало, я все еще получаю 400. Я нахожусь в последней версии 3.8.2 EE. –

ответ

0

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

message.addOutboundAttachment("file", AttachmentHelper.getURLAttachment(FilenameUtils.getName(file), file)); 
Смежные вопросы