We help IT Professionals succeed at work.

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

635 Views
1 Endorsement
Last Modified: 2017-04-20
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!
Comment
Watch Question

ste5anSenior Developer
CERTIFIED EXPERT

Commented:
What API call? Any reference link?
Dustin StanleyEntrepreneur

Author

Commented:
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
Dustin StanleyEntrepreneur

Author

Commented:
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.
Dustin StanleyEntrepreneur

Author

Commented:
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.
Remote Training and Programming
CERTIFIED EXPERT
Top Expert 2015
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Dustin StanleyEntrepreneur

Author

Commented:
Thank you crystal I read that post so many times. They never really finished it so....... Another lead but it helped.
Jim Dettman (EE MVE)President / Owner
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2017

Commented:
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
Dustin StanleyEntrepreneur

Author

Commented:
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
Jim Dettman (EE MVE)President / Owner
CERTIFIED EXPERT
Fellow
Most Valuable Expert 2017

Commented:
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.
Dustin StanleyEntrepreneur
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Dustin StanleyEntrepreneur

Author

Commented:
Thank you.
crystal (strive4peace) - Microsoft MVP, AccessRemote Training and Programming
CERTIFIED EXPERT
Top Expert 2015

Commented:
you're welcome, and thanks for sharing, Dustin ~

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.