SQL Server
SQL Server
Parse Multipart Binary Http Response
See more HTTP Examples
This example demonstrates how to parse an HTTP response that is multipart and contains a binary file, such as a .zip or .pdf.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @http int
EXEC @hr = sp_OACreate 'Chilkat.Http', @http OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
DECLARE @req int
EXEC @hr = sp_OACreate 'Chilkat.HttpRequest', @req OUT
-- ...
-- Insert code here to construct some kind of HTTP request.
-- this example is to show how to parse a particular kind of response.
-- ...
-- ...
-- Send the request (whatever it may be in your case) to get the HTTP response object.
DECLARE @resp int
EXEC @hr = sp_OACreate 'Chilkat.HttpResponse', @resp OUT
EXEC sp_OAMethod @http, 'HttpSReq', @success OUT, 'www.somedomain.com', 443, 1, @req, @resp
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @resp
RETURN
END
-- Get the response body (which is expected to be binary)
DECLARE @respBody int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @respBody OUT
EXEC sp_OAMethod @resp, 'GetBodyBd', @success OUT, @respBody
-- For this example, the response body contains something like this:
-- ------=_Part_21302_2029949381.1547401515443
-- Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
-- Content-Transfer-Encoding: 8bit
-- Content-ID: <rootpart@ws.jboss.org>
--
-- <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body>...</env:Body></env:Envelope>
-- ------=_Part_21302_2029949381.1547401515443
-- Content-Type: application/octet-stream
-- Content-Transfer-Encoding: binary
-- Content-Id: <fileArchivio-7d302908-4d64-43d3-bf4e-79ce806d43b3@ws.jboss.org>
--
-- BINARY_CONTENT_HERE...
--
-- ------=_Part_21302_2029949381.1547401515443--
--
-- Load it into a Chilkat MIME object.
DECLARE @mime int
EXEC @hr = sp_OACreate 'Chilkat.Mime', @mime OUT
EXEC sp_OAMethod @mime, 'LoadMimeBd', @success OUT, @respBody
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @mime, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @respBody
EXEC @hr = sp_OADestroy @mime
RETURN
END
DECLARE @numParts int
EXEC sp_OAGetProperty @mime, 'NumParts', @numParts OUT
IF @numParts < 2
BEGIN
PRINT 'Expected multipart MIME with at least 2 sub-parts.'
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @respBody
EXEC @hr = sp_OADestroy @mime
RETURN
END
-- Get the 1st sub-part, which is the XML.
DECLARE @part0 int
EXEC @hr = sp_OACreate 'Chilkat.Mime', @part0 OUT
EXEC sp_OAMethod @mime, 'PartAt', @success OUT, 0, @part0
-- Should be OK because we checked NumParts above..
DECLARE @xmlStr nvarchar(4000)
EXEC sp_OAMethod @part0, 'GetBodyDecoded', @xmlStr OUT
PRINT @xmlStr
PRINT '----'
-- Save the 2nd part to a file. (It is a .zip file in our test case..)
DECLARE @part1 int
EXEC @hr = sp_OACreate 'Chilkat.Mime', @part1 OUT
EXEC sp_OAMethod @mime, 'PartAt', @success OUT, 1, @part1
EXEC sp_OAMethod @part1, 'SaveBody', @success OUT, 'qa_output/attachedZip.zip'
-- Alternatively, we could extract the binary data to a BinData and use elsewhere..
DECLARE @zipData int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @zipData OUT
EXEC sp_OAMethod @part1, 'GetBodyBd', @success OUT, @zipData
EXEC sp_OAMethod @zipData, 'WriteFile', @success OUT, 'qa_output/attachedZip_again.zip'
PRINT 'OK.'
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @respBody
EXEC @hr = sp_OADestroy @mime
EXEC @hr = sp_OADestroy @part0
EXEC @hr = sp_OADestroy @part1
EXEC @hr = sp_OADestroy @zipData
END
GO