muledataweaveanypoint-studiomule4apikit

Multipart/form-data broken after apiKit router Mule4


having issues with reading data from multipart/form-data after the request goes through ApiKit router in Mule4 app.

There is a RAML in place, used in ApiKit router to validate & route the requests.

#%RAML 1.0 
title: ACC race data API
description: API for designing and updating race data
version: 1
protocols: [ HTTPS, HTTP ]

/acc/reverse/entrylist:
  description: Used to manipulate entrylist for ACC reverse grid.
  post:
    description: Creates new entrylist based on supplied quali result, race one result and race one entrylist.
    queryParameters:
      positionsRotated:
        description: Parameter defining how many positions to rotate.
        required: false
        type: number
        example: 30
    body:
      multipart/form-data:
        properties:
          qualifyResult:
                description: File containing qualifying result.
                type: file
                fileTypes: ['application/json']
                required: true
          raceOneResult:
                description: File containing race 1 result.
                type: file
                fileTypes: ['application/json']
                required: true

The validation works fine - if the data are sent in incorrect format, the exception is returned. For correctly formated data request is routed to the flow post:\acc\reverse\entrylist:multipart\form-data:acc-race-data-config. Between the steps, payload format is changed (by Mule) from payload in readable form (see below) to java.io.ByteArrayInputStream@379ebdd5

Readable format of payload data (received to the app) before ApiKit router:

----------------------------180928595588258919887097
Content-Disposition: form-data; name="qualifyResult"; filename="json1.json"
Content-Type: application/json

{
    "json1": "1"
}

----------------------------180928595588258919887097
Content-Disposition: form-data; name="raceOneResult"; filename="json2.json"
Content-Type: application/json

{
    "json2": "2"
}

----------------------------180928595588258919887097--

The following dataweave script works fine if used before apiKit, but it doesn't work in the flow called by ApiKit:

%dw 2.0
output application/json
---
payload.parts[1].content

The example of output if above DW is used before ApiKit:

{
  "json2": "2"
}

The example of output if the same DW is used after ApiKit:

org.mule.runtime.core.api.expression.ExpressionRuntimeException: "javax.mail.internet.ParseException - Missing start boundary, while reading `payload` as MultiPart.
Trace:
  at main (Unknown)" evaluating expression: "%dw 2.0

output application/json

---

payload.parts[1].content".

Testing in Anypoint Studio 7.8.0, supposed to be used on Mule4-CE runtime once finished and ready to deploy. Using Postman v8.5.1 for testing. sending form-data body with qualifyResult and raceOneResult parts containing JSON data, default headers, basic auth, query param positionsRotated=30. Url called: https://localhost:443/api/acc/reverse/entrylist?positionsRotated=30 Tried to generate multipart/form-data body manually using a RAW type of payload, but the results were the same. Everything works fine if there is no ApiKit.. but I would like to use it to validate request validity.

Thanks to everyone replying for any useful hints!


Solution

  • I tested a similar scenario I had with the latest versions and I didn't had that problem. If you are using older versions of the HTTP connector and APIKit module try upgrading to the latest releases. Anypoint Studio has a feature to detect newer releases of connectors: https://docs.mulesoft.com/studio/7.9/update-modules