DataFlex
DataFlex
How to Access Parts of a multipart/related HTTP Response
See more HTTP Examples
Demonstrates how to access the parts of a multipart/related response. This example sends a ficticious multipart/related request, and handles a ficticious multipart/related response.We send the following multipart/related request:
Content-Type: multipart/related; start-info="text/xml"; type="application/xop+xml"; boundary="----=_Part_0_1744155.1118953559416"
Content-Length: 3453
SOAPAction: "some-SOAP-action"
------=_Part_1_4558657.1118953559446
Content-Type: application/xop+xml; type="text/xml"; charset=utf-8
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Detail xmlns="http://example.org/mtom/data">
<image>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org" />
</image>
</Detail>
</soap:Body>
</soap:Envelope>
------=_Part_1_4558657.1118953559446
Content-Type: image/jpeg
Content-ID: <5aeaa450-17f0-4484-b845-a8480c363444@example.org>
... binary data ...
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoHttp
Handle hoSoapXml
String sXmlBody
Variant vReq
Handle hoReq
Boolean iUseTls
Variant vResp
Handle hoResp
Handle hoMime
Variant vPart0
Handle hoPart0
String sSubPartXmlBody
String sTemp1
Integer iTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatHttp)) To hoHttp
If (Not(IsComObjectCreated(hoHttp))) Begin
Send CreateComObject of hoHttp
End
Get Create (RefClass(cComChilkatXml)) To hoSoapXml
If (Not(IsComObjectCreated(hoSoapXml))) Begin
Send CreateComObject of hoSoapXml
End
// Build the following SOAP XML
// <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
// <soap:Body>
// <Detail xmlns="http://example.org/mtom/data">
// <image>
// <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org" />
// </image>
// </Detail>
// </soap:Body>
// </soap:Envelope>
Set ComTag Of hoSoapXml To "soap:Envelope"
Get ComAddAttribute Of hoSoapXml "xmlns:soap" "http://schemas.xmlsoap.org/soap/envelope/" To iSuccess
Get ComUpdateAttrAt Of hoSoapXml "soap:Body|Detail" True "xmlns" "http://example.org/mtom/data" To iSuccess
Get ComUpdateAttrAt Of hoSoapXml "soap:Body|Detail|image|xop:Include" True "xmlns:xop" "http://www.w3.org/2004/08/xop/include" To iSuccess
Get ComUpdateAttrAt Of hoSoapXml "soap:Body|Detail|image|xop:Include" True "href" "cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org" To iSuccess
Set ComEmitXmlDecl Of hoSoapXml To False
Get ComGetXml Of hoSoapXml To sXmlBody
Showln sXmlBody
Get Create (RefClass(cComChilkatHttpRequest)) To hoReq
If (Not(IsComObjectCreated(hoReq))) Begin
Send CreateComObject of hoReq
End
Set ComHttpVerb Of hoReq To "POST"
Set ComPath Of hoReq To "/something/someTarget"
Set ComContentType Of hoReq To 'multipart/related; start-info="text/xml"; type="application/xop+xml"'
Send ComAddHeader To hoReq "SOAPAction" "some-SOAP-action"
Get ComAddStringForUpload2 Of hoReq "" "" sXmlBody "utf-8" 'application/xop+xml; type="text/xml"; charset=utf-8' To iSuccess
// The bytes will be sent as binary (not base64 encoded).
Get ComAddFileForUpload2 Of hoReq "" "qa_data/jpg/starfish.jpg" "image/jpeg" To iSuccess
// The JPEG data is the 2nd sub-part, and therefore is at index 1 (the first sub-part is at index 0)
Get ComAddSubHeader Of hoReq 1 "Content-ID" "<5aeaa450-17f0-4484-b845-a8480c363444@example.org>" To iSuccess
Set ComFollowRedirects Of hoHttp To True
Move True To iUseTls
Get Create (RefClass(cComChilkatHttpResponse)) To hoResp
If (Not(IsComObjectCreated(hoResp))) Begin
Send CreateComObject of hoResp
End
Get pvComObject of hoReq to vReq
Get pvComObject of hoResp to vResp
Get ComHttpSReq Of hoHttp "www.example.org" 443 iUseTls vReq vResp To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
// Imagine the HTTP response is multipart related and is something like this:
// HTTP/1.1 200 OK
// Cache-Control: no-cache, no-store
// Pragma: no-cache
// Transfer-Encoding: chunked
// Content-Type: multipart/related; boundary=------------080001080500020607080905
// Expires: -1
// Server: Microsoft-IIS/10.0
// X-AspNet-Version: 4.0.30319
// X-Powered-By: ASP.NET
// Date: Wed, 19 Feb 2020 15:27:06 GMT
//
// --------------080001080500020607080905
// Content-Type: application/xop+xml; charset=iso-8859-1
// Content-Id: RootPart
// Content-Transfer-Encoding: binary
//
// <?xml version="1.0" encoding="iso-8859-1"?>
// <soapenv:Envelope xmlns:xcpt="...">
// <soapenv:Header />
// <soapenv:Body>
// <xres:Transport profile="http://something.example.com/..." version="1.4">
// <xres:TransportHeader>
// ...
// ...
// </xres:TransportHeader>
// <xres:TransportBody />
// </xres:Transport>
// </soapenv:Body>
// </soapenv:Envelope>
// --------------080001080500020607080905--
// To get the XML, load the full MIME of the response into a Chilkat MIME object. Then get the body of the 1st sub-part.
Get Create (RefClass(cComChilkatMime)) To hoMime
If (Not(IsComObjectCreated(hoMime))) Begin
Send CreateComObject of hoMime
End
Get ComFullMime Of hoResp To sTemp1
Get ComLoadMime Of hoMime sTemp1 To iSuccess
// Your code might verify that the Content-Type is indeed multipart/related.
Get ComContentType Of hoMime To sTemp1
Showln sTemp1
Get ComNumParts Of hoMime To iTemp1
Showln "num parts = " iTemp1
// Assuming it is, and the number of sub-parts is > 0
Get ComNumParts Of hoMime To iTemp1
If (iTemp1 > 0) Begin
Get Create (RefClass(cComChilkatMime)) To hoPart0
If (Not(IsComObjectCreated(hoPart0))) Begin
Send CreateComObject of hoPart0
End
Get pvComObject of hoPart0 to vPart0
Get ComPartAt Of hoMime 0 vPart0 To iSuccess
// The Content-Type (in this ficticious example) should be "application/xop+xml"
Get ComContentType Of hoPart0 To sTemp1
Showln "sub-part Content-Type: " sTemp1
// Now get the XML
Get ComGetBodyDecoded Of hoPart0 To sSubPartXmlBody
Showln sSubPartXmlBody
End
End_Procedure