Avatar of Dustin Stanley
Dustin Stanley

asked on 

MS Access VBA How To Properly Set Up A multipart/related HTTP Request

I need help in setting up a proper multipart/related HTTP request in VBA. If you can PLEASE show me samples in VBA of one.  A picture (Or Code) is worth a thousand words.

Here is my code for sending XML over HTTP currently:

Option Compare Database
Option Explicit

Public Function EbaySenderXmlAddFixedPriceItems()
Dim reader As New MSXML2.XMLHTTP40
    Dim doc As New MSXML2.DOMDocument 'If you want to load the XML Document instead of creating it.
    Dim TokenValue As String
    Dim APICALL As String
    
    '*************************************************************************************************************
    'API Call Name!
    '*************************************************************************************************************
      APICALL = "uploadFile" 'Place the API Call Name here within the parenthesis.
    '*************************************************************************************************************
    'Place Token Value Here Below!
    TokenValue = "TOKEN GOES HERE Like ujhuhuaeuyaeyayuo8i"
    '*************************************************************************************************************
    doc.Load "C:\Users\Station\Documents\Access XML Save Files\uploadFile.xml" 'Document Location of the XML File With Items Being Added
   
   
    '*************************************************************************************************************
    'Set The Headers Up!
    '*************************************************************************************************************
    reader.Open "POST", "https://storage.sandbox.ebay.com/FileTransferService", False
    reader.setRequestHeader "Content-ID", "<0.urn.uuid:FileAttachment UUID Here>" 'Must include FileAttachment UUID that matches the FileAttachment UUID!
    reader.setRequestHeader "X-EBAY-SOA-OPERATION-NAME", APICALL 'API Call Name
    reader.setRequestHeader "X-EBAY-SOA-SECURITY-TOKEN", TokenValue ' This is your Highly Secret Token. Place the Token above in the code where it says "Place Token Value Here!".
    reader.setRequestHeader "X-EBAY-SOA-SERVICE-VERSION", "1.5.0" 'Usually never have to change this unless if there is an update.
    reader.setRequestHeader "X-EBAY-API-SITEID", "0" ' 0 is for the USA Site!
    reader.setRequestHeader "X-EBAY-API-DEV-NAME", "Dev Name Here" 'Developers Name Code.
    reader.setRequestHeader "X-EBAY-API-APP-NAME", "App Name Here" 'Applications Name Code.
    reader.setRequestHeader "X-EBAY-API-CERT-NAME", "Certificate Name Here" 'Certificate Name Code.
    
    '*************************************************************************************************************
    'Use The Code After The Example Below To Build The XML File Instead Of Loading An Already Existing One!
    '*************************************************************************************************************
    'Expected OutPut Example!
    '**************************
    
    '<?xml version="1.0" encoding="UTF-8"?>
'<uploadFileRequest xmlns="http://www.ebay.com/marketplace/services">
  '<!-- Call-specific Input Fields -->
  '<fileAttachment> FileAttachment
    '<Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:urn:uuid:FileAttachment UUID Here"/></Data>
    '<Size>15</Size>
  '</fileAttachment>
  '<fileFormat>gzip</fileFormat>
  '<fileReferenceId>FILE REFRENCE ID HERE</fileReferenceId>
  '<taskReferenceId>JOB ID HERE</taskReferenceId>
'</uploadFileRequest>
'*************************************************************************************************************
    'Dim uploadFile As String 'If you want to create the XML Document instead of loading it.
   
    
    'uploadFile = ""
    'uploadFile = uploadFile & "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbNewLine
    'uploadFile = uploadFile & "<fileAttachment>" & vbNewLine
    'uploadFile = uploadFile & "<Data><xop:Include xmlns:xop=""http://www.w3.org/2004/08/xop/include"" href=""cid:urn:uuid:9eda0520-1a27-11e7-93ae-92361f002671""/></Data>" & vbNewLine
    'uploadFile = uploadFile & "<Size>15</Size>"
    'uploadFile = uploadFile & "<fileFormat>gzip</fileFormat>" & vbNewLine
    'uploadFile = uploadFile & "<fileReferenceId>50015247856</fileReferenceId>" & vbNewLine
    'uploadFile = uploadFile & "<taskReferenceId>50012765386</taskReferenceId>" & vbNewLine
    'uploadFile = uploadFile & "</uploadFileRequest>"
    
       'MsgBox uploadFile 'Shows MessageBox of the created XML file above.
         'reader.send uploadFile 'This sends the XML document from above that was created.

    '*************************************************************************************************************
    
    reader.send doc 'This sends the XML document from above that was loaded.
    
    
Do Until reader.ReadyState = 4
        DoEvents
    Loop
    
    MsgBox (reader.responseText) 'Shows MessageBox of the Servers Response. ie...Success or Error!
    
    If reader.Status = 200 Then
        Set doc = reader.responseXML
        doc.Save "C:\Users\Station\Documents\Access XML Save Files\New Testing\eBayReturnFile.xml" 'This is the return response from ebay after the document is sent and they process it.
         'MsgBox "PERFECT JUST LIKE YOU :)"
        
        Application.ImportXML "C:\Users\Station\Documents\Access XML Save Files\New Testing\eBayReturnFile.xml", acStructureAndData
        
    Else
        MsgBox "Error " & Err.Number & ": " & Err.Description & " in " & _
   VBE.ActiveCodePane.CodeModule, vbOKOnly, "Error"
    End If
    Set reader = Nothing
End Function

Open in new window




This next code is in PHP (I think but I'm not sure.) but I need my VBA to be set up similiar:
-----------START-----------
 POST https://storage.sandbox.ebay.com/FileTransferService
 Accept-Encoding: gzip, deflate
 X-EBAY-SOA-OPERATION-NAME: uploadFile
 Accept: */*
 X-EBAY-SOA-SERVICE-VERSION: 1.1.0
 X-EBAY-SOA-SERVICE-NAME: FileTransferService
 Content-Length: 3936
 Connection: keep-alive
 Content-Type: multipart/related; boundary=MIME_boundary; type="application/xop+xml"; start="<0.urn:uuid:b2e95d5c-54ed-46ad-b479-fed744f2b8ca>"; start-info="text/xml"
 User-Agent: python-requests/2.5.1 CPython/3.3.4 Darwin/14.0.0
 X-EBAY-SOA-SECURITY-TOKEN: **MYSANDBOXTOKEN**
 
 
 --MIME_boundary
 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml; charset=UTF-8"
 Content-Transfer_Encoding: binary
 Content-ID: <0.urn:uuid:b2e95d5c-54ed-46ad-b479-fed744f2b8ca>
 
 <uploadFileRequest xmlns:sct="http://www.ebay.com/soaframework/common/types" xmlns="http://www.ebay.com/marketplace/services">
 <taskReferenceId>50008909051</taskReferenceId>
 <fileReferenceId>50009059491</fileReferenceId>
 <fileFormat>gzip</fileFormat>
 <fileAttachment>
 <Size>3121</Size>
 <Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:urn:uuid:034d5afc-e1ac-4158-afab-8aae07e1423c"/></Data>
 </fileAttachment>
 </uploadFileRequest>
 
 
 --MIME_boundary
 Content-Type: application/octet-stream
 Content-Transfer-Encoding: base64
 Content-ID: <urn:uuid:034d5afc-e1ac-4158-afab-8aae07e1423c>
 
 H4sIALnxy1QC/60YaXPixvL7/go9f8l7S9biFmxpVU9c5gZzm1QqNWgGaUAH1owA+denR+IQttkkVdkqLzN9X9  **... MORE ENCODED DATA ....** PZ/vc0wdv/LK3Rj3bRphsdvlxJT+c58l0olS58V7G1JiQXaioJin7Iu/frHXwTk+//fvgnOnxkwFsUAAA=
 --MIME_boundary--
 

Open in new window


Thank you for the help!
Microsoft AccessXMLVBAMicrosoft OfficeWeb Development

Avatar of undefined
Last Comment
crystal (strive4peace) - Microsoft MVP, Access
Avatar of ste5an
ste5an
Flag of Germany image

What API call? Any reference link?
Avatar of Dustin Stanley
Dustin Stanley

ASKER

Thank you. I am out of my office right now. I can get more information later today.

uploadFile https://developer.ebay.com/DevZone/file-transfer/CallRef/uploadFile.html

this is used through eBay Large Merchant Services

http://developer.ebay.com/DevZone/large-merchant-services/Concepts/LMS_APIGuide.html
Avatar of Dustin Stanley

ASKER

Here is the main API focuses of mine right now.

I am needing to make a call named AddFixedPriceItem.

This is going to be a multiple call combined into one. A repetitive AddFixedPriceItem call.

To combine several calls into one you have to use eBay "BulkDataExchangeRequest".

The only thing this means is that in the XML file I will have a call for AddFixedPriceItem that looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
  <Header>
    <Version>967</Version>
    <SiteID>0</SiteID>
  </Header>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <ErrorLanguage>en_US</ErrorLanguage>
  <WarningLevel>High</WarningLevel>
  <Version>967</Version>
  <Item>
    <CategoryMappingAllowed>true</CategoryMappingAllowed>
    <Country>US</Country>
    <Currency>USD</Currency>
    <Description>Minimal fixed-price shoe listing with SKU, free shipping, 3-day dispatch time, return policy, and no Item Specifics. New Nike Shox Elite TB White/White-Black-Chrome. Size: Mens US 12, UK 11, Europe 46 (Medium, D, M). Condition: New in box.</Description>
    <DispatchTimeMax>3</DispatchTimeMax>
    <InventoryTrackingMethod>SKU</InventoryTrackingMethod>
    <ListingDuration>Days_30</ListingDuration>
    <ListingType>FixedPriceItem</ListingType>
    <Location>San Jose, CA</Location>
    <PaymentMethods>PayPal</PaymentMethods>
    <PayPalEmailAddress>MegaOnlineMerchant@gmail.com</PayPalEmailAddress>
    <PrimaryCategory>
      <CategoryID>63850</CategoryID>
    </PrimaryCategory>
    <Quantity>6</Quantity>
    <ReturnPolicy>
      <ReturnsAcceptedOption>ReturnsAccepted</ReturnsAcceptedOption>
      <RefundOption>MoneyBack</RefundOption>
      <ReturnsWithinOption>Days_30</ReturnsWithinOption>
      <Description>Text description of return policy details here.</Description>
      <ShippingCostPaidByOption>Buyer</ShippingCostPaidByOption>
    </ReturnPolicy>
    <ShippingDetails>
      <ShippingType>Flat</ShippingType>
      <ShippingServiceOptions>
        <ShippingServicePriority>1</ShippingServicePriority>
        <ShippingService>USPSPriority</ShippingService>
        <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost>
        <ShippingServiceAdditionalCost>0.00</ShippingServiceAdditionalCost>
        <FreeShipping>true</FreeShipping>
      </ShippingServiceOptions>
    </ShippingDetails>
    <Site>US</Site>
    <SKU>1122334455-14</SKU>
    <StartPrice>50.00</StartPrice>
    <Title>New Nike Shox Elite TB White Mens Basketball Shoes S 12</Title>
    <UUID>7d004a30b0f511ddad8b0807654c9a56</UUID>
  </Item>
</AddFixedPriceItemRequest>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <ErrorLanguage>en_US</ErrorLanguage>
  <WarningLevel>High</WarningLevel>
  <Version>967</Version>
  <Item>
    <CategoryMappingAllowed>true</CategoryMappingAllowed>
    <Country>US</Country>
    <Currency>USD</Currency>
    <Description>Minimal fixed-price shoe listing with SKU, free shipping, 3-day dispatch time, return policy, and no Item Specifics. New Nike Shox Elite TB BLACK / WHITE-VARSITY RED. Size: Mens US 12, UK 11, Europe 46 (Medium, D, M). Condition: New in box.</Description>
    <DispatchTimeMax>3</DispatchTimeMax>
    <InventoryTrackingMethod>SKU</InventoryTrackingMethod>
    <ListingDuration>Days_30</ListingDuration>
    <ListingType>FixedPriceItem</ListingType>
    <Location>San Jose, CA</Location>
    <PaymentMethods>PayPal</PaymentMethods>
    <PayPalEmailAddress>MegaOnlineMerchant@gmail.com</PayPalEmailAddress>
    <PrimaryCategory>
      <CategoryID>63850</CategoryID>
    </PrimaryCategory>
    <Quantity>6</Quantity>
    <ReturnPolicy>
      <ReturnsAcceptedOption>ReturnsAccepted</ReturnsAcceptedOption>
      <RefundOption>MoneyBack</RefundOption>
      <ReturnsWithinOption>Days_30</ReturnsWithinOption>
      <Description>Text description of return policy details here.</Description>
      <ShippingCostPaidByOption>Buyer</ShippingCostPaidByOption>
    </ReturnPolicy>
    <ShippingDetails>
      <ShippingType>Flat</ShippingType>
      <ShippingServiceOptions>
        <ShippingServicePriority>1</ShippingServicePriority>
        <ShippingService>USPSPriority</ShippingService>
        <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost>
        <ShippingServiceAdditionalCost>0.00</ShippingServiceAdditionalCost>
        <FreeShipping>true</FreeShipping>
      </ShippingServiceOptions>
    </ShippingDetails>
    <Site>US</Site>
    <SKU>1122334455-15</SKU>
    <StartPrice>55.00</StartPrice>
    <Title>New Nike Shox Elite TB Black Mens Basketball Shoes S 12</Title>
    <UUID>7d005a30b0f511ddad8b0876540c9a57</UUID>
  </Item>
</AddFixedPriceItemRequest>
</BulkDataExchangeRequests>

Open in new window


You can see in the example above there are 2 AddFixedPriceItem Calls.  To send them together you have to Wrap them in the Main Root "BulkDataExchangeRequests".

Then AddFixedPriceItem XML file has to be encoded in Base64 Binary format and included in the request according to the SOAP MTOM standard.

That's it for the AddFixedPriceItem XML file.
Specs (For the Bulk Call it is towards the end of this page at this link below: http://developer.ebay.com/devzone/xml/docs/reference/ebay/AddFixedPriceItem.html
****************************************************************************************************
In order to send that "AddFixedPriceItem XML File" I have to make the main call named "uploadFile" with AddFixedPriceItem as an attachment.

Specs: https://developer.ebay.com/DevZone/file-transfer/CallRef/uploadFile.html

The uploadFile XML file looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<uploadFileRequest xmlns="http://www.ebay.com/marketplace/services">
  <!-- Call-specific Input Fields -->
  <fileAttachment>
    <Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:urn:uuid:7d005a30b0f511ddad8b0876540c9a55"/></Data>
    <Size>15</Size>
  </fileAttachment>
  <fileFormat>gzip</fileFormat>
  <fileReferenceId>50047856</fileReferenceId>
  <taskReferenceId>50012766</taskReferenceId>
</uploadFileRequest>

Open in new window


If you look at Line 5 <Data> there is a special UUID that I generated. This UUID (Line 5) is there and mandatory so you do not accidentally upload the same thing multiple times. Each upload has to have a new UUID.

I have to send both of these files together for this call (uploadFile as the main call) & (AddFixedPriceItem as the fileAttachment)

*****************************************************************************************************

So this is where I am struggling I have to Set Up A multipart/related HTTP Request and I do not know exactly how.

I hope this helps. I thank you very much for the help.
Avatar of Dustin Stanley

ASKER

This seems like a rare thing here on Experts-Exchange or anywhere online. It would be nice for a good tutorial for future visitors.

So far I have not had any luck except with using ChillKat Software. But as far as for VBA nothing.
ASKER CERTIFIED SOLUTION
Avatar of crystal (strive4peace) - Microsoft MVP, Access
crystal (strive4peace) - Microsoft MVP, Access

Blurred text
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
Avatar of Dustin Stanley

ASKER

Thank you crystal I read that post so many times. They never really finished it so....... Another lead but it helped.
Dustin,

 I'm not sure what your question is here,   Other than the fact that you seem to be saying   " please do this for me ".

   I do know you have tried on this, but I wanted to say that this is where many of us on EE would draw the line and that is actually doing the work. It's one thing to help you out with a problem or two but it's another to sit down and actually write the thing,  which is what many of us do professionally for a living  and charge clients for.

  I did see the gigs you posted, but respectfully the price was way too low. This is where many people that don't develop fail to understand the time  and effort  it takes to develop a good piece of code  or application

  You do have all the pieces to this.  the problem is nothing more than working with the pieces you've already asked questions on.  

 I would suggest the gigs approach again, but offer more what the job is worth. This is probably in the range of 12 to 16 hours worth of work by the time someone understands what needs to be done, actually codes it, tests it,  handles any issues that arise, and documents it all.

 Food for thought,

Jim
Avatar of Dustin Stanley

ASKER

I thank you Jim and please don't take this question in that way. I am not an expert and I do not want anyone to do this for me.

I have collected a ton of information and I would like to even make the post of the proper tutorial myself but I do not want to mis inform anyone.

There is procedures you have to do and you have to have exact spacing for the server to understand the MIME Also some other details that has to be exactly correct or the MIME fails.

Also the "Gig" I posted before was seriously more of a help me through this so I can learn. Just as always I want to learn this. Not for you to do it for me.

The main request here is just to show the proper way to set up a multi part / related MIME.......

Which I have found out there is not very much info online about how to do this in VBA.

I have already succeeded in my exact procedure but there are a few things I am still unsure of. I thought "Hey I could delete this question but hopefully some experts would chime in and show some good solid answers for future visitors" ......but then I thought "I can write a tutorial but I am not 100% sure more like 60%".

Anyway I thank you for help you have always given me and I do not want to come off as a (what I would call a BUM) or a butt.

But (no pun intended :)) this would be a HUGE chance for future visitors if this question thoroughly got answered correctly.

Thanks Jim
I thank you Jim and please don't take this question in that way.

 And I hope you didn't take my comment the wrong way either.  I was simply trying to point out why you were not getting responses.   This has reached the point where someone needs simply "do it" one way or another.

 Unless you keep the questions small and focused on one paticular aspect, no one will grab onto this.   It's too much of a project as a whole.   Also read on.

The main request here is just to show the proper way to set up a multi part / related MIME.......
Which I have found out there is not very much info online about how to do this in VBA.

Maybe that's part of the disconnect here; understand that when you reach a certain point, there is no "right way" to do something and two people may develop the same solution in entirely different ways.   One may be better than the other when it comes to maintaining it in the future or doing it with less code, or being more efficient, but you can't stand back and say necessarily one is right or wrong if both produce the same result.

 What Classes, Procedures, code, etc someone comes up with is in most aspects unique.  So again, until someone would sit down and actually do this, your probably not going to get an answer.

 If you want to continue doing this on your own, my suggestion would be to start at the beginning, build it up bit by bit, and ask a series of focused questions (something that can be understood and answered within minutes) on a very specific part that your trying to do.

  In asking a generalized question like this about the whole task, your not going to get any takers.

Jim.
SOLUTION
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
Avatar of Dustin Stanley

ASKER

Thank you.
you're welcome, and thanks for sharing, Dustin ~
Microsoft Access
Microsoft Access

Microsoft Access is a rapid application development (RAD) relational database tool. Access can be used for both desktop and web-based applications, and uses VBA (Visual Basic for Applications) as its coding language.

226K
Questions
--
Followers
--
Top Experts
Get a personalized solution from industry experts
Ask the experts
Read over 600 more reviews

TRUSTED BY

IBM logoIntel logoMicrosoft logoUbisoft logoSAP logo
Qualcomm logoCitrix Systems logoWorkday logoErnst & Young logo
High performer badgeUsers love us badge
LinkedIn logoFacebook logoX logoInstagram logoTikTok logoYouTube logo