Multipart requests or responses
In GWS REST there is support for the standard multiple part message, in which more than one different sets of data are combined in a single body.
You can specify an HTTP multipart request or response for transferring data of several MIME types, such as JSON, XML, simple string, and to upload or download files.
Multipart/form-data support
In the multipart/form-data type, entire files can be included in the data
transfer without encoding. This is ideally suited for uploading and downloading image or text files
to a Web service. 
Separate parts are identified by the GWS REST engine's naming
convention sequence for headers and body parts that start with "rv0" and goes to the
"rvnth" number of parts. You can change default header naming by adding a value in the
WSName attribute to your
parameter.
The GWS REST engine also creates a "boundary" string in the "Content-Type: " header. This boundary, is placed between the various parts, and at the beginning and end of the body of the message.
From GWS version 4.00 onwards you can set Content-Type headers for each data
part in a multipart message via the WSContext dictionary variable. For more
information about the WSContext attribute and an example using multipart, see Example WSContext with multipart Content-Type set at runtime.
Define multipart request body
WSHeader, WSQuery, WSCookie, or
WSParam attributes. The GWS handles this request as a multipart of
form-data type. Typically, you specify an input body parameter when you perform an
HTTP PUT, POST, or PATCH request to a resource, otherwise you get error-9106. However, you can set
WSOptional on the
ATTRIBUTE().  For a sample function, see Set a request body as optional.
Example multipart request
IMPORT com
IMPORT util
PUBLIC DEFINE myError RECORD ATTRIBUTE(WSError="My error")
  code INTEGER,
  reason STRING
END RECORD
PUBLIC FUNCTION updateUsersAddress(
    id INTEGER ATTRIBUTES(WSParam),
    addressfld1 STRING,
    date2 STRING)
  ATTRIBUTES(WSPut,
             WSPath="/users/{id}",
             WSDescription="Update user address and date updated field",
             WSThrows="400:@myerror")
  RETURNS STRING
    DEFINE ret STRING
    DEFINE dt DATETIME YEAR TO SECOND
    LET dt = util.Datetime.parse(date2, "%Y-%m-%d %H:%M:%S" )
    IF (dt IS NULL) THEN
        LET ret = "Invalid date"
    ELSE  
       WHENEVER ERROR CONTINUE
       UPDATE course2 SET users_address= addressfld1, date_updated=dt
             WHERE @users_id = id
       WHENEVER ERROR STOP
       CASE
       WHEN sqlca.sqlcode == 0
          LET ret = SFMT("Updated user with ID: %1",id)
       WHEN sqlca.sqlcode == NOTFOUND
          LET ret = SFMT("No resource found for ID:  %1",id)
       OTHERWISE
         LET myError.reason = SFMT("SQL error:%1 [%2]",sqlca.sqlcode, SQLERRMESSAGE)
         CALL com.WebServiceEngine.SetRestError(400,myError)
       END CASE
    END IF
    RETURN ret
END FUNCTIONDefine multipart response body
WSHeader attributes. The GWS handles this as a multipart response of type
form-data.A message body in the response is required when you perform an HTTP GET, POST, PUT, DELETE operation on a resource, otherwise the response results in the error-9106.
Example multipart response
RETURNS clause of the function. These do not have WSHeader
attributes, so values are sent in separate parts in the response
body:PUBLIC FUNCTION help()
  ATTRIBUTES (WSGet,
              WSPath="/help")
  RETURNS (INTEGER ATTRIBUTE(WSHeader), STRING, STRING)
    RETURN 3, "Hello world", "Have a nice day."
END FUNCTION