Sample code for 30+ languages & platforms
SQL Server

SOAP with MTOM XOP 8bit (binary) Attachment

See more HTTP Examples

Demonstrates how to send the following sample SOAP request with an MTOM/XOP attachment:
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: _LT_5aeaa450-17f0-4484-b845-a8480c363444@example.org_GT_
Content-Disposition: 8bit

... binary data ...

Chilkat SQL Server Downloads

SQL Server
-- 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 @soapXml int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @soapXml OUT

    EXEC sp_OASetProperty @soapXml, 'Tag', 'soap:Envelope'
    EXEC sp_OAMethod @soapXml, 'AddAttribute', @success OUT, 'xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/'

    EXEC sp_OAMethod @soapXml, 'NewChild2', NULL, 'soap:Body', ''
    EXEC sp_OAMethod @soapXml, 'GetChild2', @success OUT, 0

    EXEC sp_OAMethod @soapXml, 'NewChild2', NULL, 'Detail', ''
    EXEC sp_OAMethod @soapXml, 'GetChild2', @success OUT, 0
    EXEC sp_OAMethod @soapXml, 'AddAttribute', @success OUT, 'xmlns', 'http://example.org/mtom/data'

    EXEC sp_OAMethod @soapXml, 'NewChild2', NULL, 'image', ''
    EXEC sp_OAMethod @soapXml, 'GetChild2', @success OUT, 0

    EXEC sp_OAMethod @soapXml, 'NewChild2', NULL, 'xop:Include', ''
    EXEC sp_OAMethod @soapXml, 'GetChild2', @success OUT, 0
    EXEC sp_OAMethod @soapXml, 'AddAttribute', @success OUT, 'xmlns:xop', 'http://www.w3.org/2004/08/xop/include'
    EXEC sp_OAMethod @soapXml, 'AddAttribute', @success OUT, 'href', 'cid:5aeaa450-17f0-4484-b845-a8480c363444@example.org'

    EXEC sp_OAMethod @soapXml, 'GetRoot2', NULL
    EXEC sp_OASetProperty @soapXml, 'EmitXmlDecl', 0

    DECLARE @xmlBody nvarchar(4000)
    EXEC sp_OAMethod @soapXml, 'GetXml', @xmlBody OUT

    PRINT @xmlBody

    DECLARE @req int
    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>'

    -- Add the Content-Disposition: 8bit sub-header
    EXEC sp_OAMethod @req, 'AddSubHeader', @success OUT, 1, 'Content-Disposition', '8bit'

    EXEC sp_OASetProperty @http, 'FollowRedirects', 1

    -- For debugging, set the SessionLogFilename property
    -- to see the exact HTTP request and response in a log file.
    -- (Given that the request contains binary data, you'll need an editor
    -- that can gracefully view text + binary data.  I use EmEditor for most simple editing tasks..)
    EXEC sp_OASetProperty @http, 'SessionLogFilename', 'qa_output/mtom_sessionLog.txt'

    DECLARE @useTls int
    SELECT @useTls = 1
    -- Note: Please don't run this example without changing the domain to your own domain...
    DECLARE @resp int
    EXEC @hr = sp_OACreate 'Chilkat.HttpResponse', @resp OUT

    EXEC sp_OAMethod @http, 'HttpSReq', @success OUT, 'www.example.org', 443, @useTls, @req, @resp
    IF @success = 0
      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
        EXEC @hr = sp_OADestroy @resp
        RETURN
      END

    DECLARE @xmlResponse int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @xmlResponse OUT

    EXEC sp_OAGetProperty @resp, 'BodyStr', @sTmp0 OUT
    EXEC sp_OAMethod @xmlResponse, 'LoadXml', @success OUT, @sTmp0
    EXEC sp_OAMethod @xmlResponse, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    EXEC @hr = sp_OADestroy @http
    EXEC @hr = sp_OADestroy @soapXml
    EXEC @hr = sp_OADestroy @req
    EXEC @hr = sp_OADestroy @resp
    EXEC @hr = sp_OADestroy @xmlResponse


END
GO