Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) How to Access Parts of a multipart/related HTTP ResponseDemonstrates 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 ...
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @iTmp0 int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. DECLARE @http int -- Use "Chilkat_9_5_0.Http" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Http', @http OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @soapXml int -- Use "Chilkat_9_5_0.Xml" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Xml', @soapXml OUT -- 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> EXEC sp_OASetProperty @soapXml, 'Tag', 'soap:Envelope' DECLARE @success int EXEC sp_OAMethod @soapXml, 'AddAttribute', @success OUT, 'xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/' EXEC sp_OAMethod @soapXml, 'UpdateAttrAt', @success OUT, 'soap:Body|Detail', 1, 'xmlns', 'http://example.org/mtom/data' EXEC sp_OAMethod @soapXml, 'UpdateAttrAt', @success OUT, 'soap:Body|Detail|image|xop:Include', 1, 'xmlns:xop', 'http://www.w3.org/2004/08/xop/include' EXEC sp_OAMethod @soapXml, 'UpdateAttrAt', @success OUT, 'soap:Body|Detail|image|xop:Include', 1, 'href', 'cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org' EXEC sp_OASetProperty @soapXml, 'EmitXmlDecl', 0 DECLARE @xmlBody nvarchar(4000) EXEC sp_OAMethod @soapXml, 'GetXml', @xmlBody OUT PRINT @xmlBody DECLARE @req int -- Use "Chilkat_9_5_0.HttpRequest" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.HttpRequest', @req OUT EXEC sp_OASetProperty @req, 'HttpVerb', 'POST' EXEC sp_OASetProperty @req, 'Path', '/something/someTarget' EXEC sp_OASetProperty @req, 'ContentType', 'multipart/related; start-info="text/xml"; type="application/xop+xml"' EXEC sp_OAMethod @req, 'AddHeader', NULL, 'SOAPAction', 'some-SOAP-action' EXEC sp_OAMethod @req, 'AddStringForUpload2', @success OUT, '', '', @xmlBody, 'utf-8', 'application/xop+xml; type="text/xml"; charset=utf-8' -- The bytes will be sent as binary (not base64 encoded). EXEC sp_OAMethod @req, 'AddFileForUpload2', @success OUT, '', 'qa_data/jpg/starfish.jpg', 'image/jpeg' -- The JPEG data is the 2nd sub-part, and therefore is at index 1 (the first sub-part is at index 0) EXEC sp_OAMethod @req, 'AddSubHeader', @success OUT, 1, 'Content-ID', '<5aeaa450-17f0-4484-b845-a8480c363444@example.org>' EXEC sp_OASetProperty @http, 'FollowRedirects', 1 DECLARE @useTls int SELECT @useTls = 1 DECLARE @resp int EXEC sp_OAMethod @http, 'SynchronousRequest', @resp OUT, 'www.example.org', 443, @useTls, @req EXEC sp_OAGetProperty @http, 'LastMethodSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @http EXEC @hr = sp_OADestroy @soapXml EXEC @hr = sp_OADestroy @req 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. DECLARE @mime int -- Use "Chilkat_9_5_0.Mime" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Mime', @mime OUT EXEC sp_OAGetProperty @resp, 'FullMime', @sTmp0 OUT EXEC sp_OAMethod @mime, 'LoadMime', @success OUT, @sTmp0 -- Your code might verify that the Content-Type is indeed multipart/related. EXEC sp_OAGetProperty @mime, 'ContentType', @sTmp0 OUT PRINT @sTmp0 EXEC sp_OAGetProperty @mime, 'NumParts', @iTmp0 OUT PRINT 'num parts = ' + @iTmp0 -- Assuming it is, and the number of sub-parts is > 0 EXEC sp_OAGetProperty @mime, 'NumParts', @iTmp0 OUT IF @iTmp0 > 0 BEGIN DECLARE @part0 int EXEC sp_OAMethod @mime, 'GetPart', @part0 OUT, 0 -- The Content-Type (in this ficticious example) should be "application/xop+xml" EXEC sp_OAGetProperty @part0, 'ContentType', @sTmp0 OUT PRINT 'sub-part Content-Type: ' + @sTmp0 -- Now get the XML DECLARE @subPartXmlBody nvarchar(4000) EXEC sp_OAMethod @part0, 'GetBodyDecoded', @subPartXmlBody OUT PRINT @subPartXmlBody EXEC @hr = sp_OADestroy @part0 END EXEC @hr = sp_OADestroy @resp EXEC @hr = sp_OADestroy @http EXEC @hr = sp_OADestroy @soapXml EXEC @hr = sp_OADestroy @req EXEC @hr = sp_OADestroy @mime END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.