Creating Items (WebDAV)

Creating Items (WebDAV)

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.To create non-folder items using the World Wide Web Distributed Authoring and Versioning (WebDAV) protocol

  1. Create a WebDAV PUT Method or PROPPATCH Method request. The request Uniform Resource Identifier (URI) for the command is the URI to the item that you are creating.
  2. When using a PUT Method, set the Translate: HTTP header to the value "f" (false).
  3. When using a PUT Method, send the stream for the item as the request body.
  4. When using a PROPPATCH Method, send the values of the properties in the request body.
  5. Set the Content-Type: header to the appropriate value, for example "text/html; charset=\"iso-8859-1\"" or "text/xml".
  6. Send the request.
  7. If successful, the response status will be "201 Created".

See Constructing Exchange Store HTTP URLs and Authentication and Security Using WebDAV for more information.

The following code shows a typical PUT Method request:

PUT /pub2/folder1/folder2/item1.txt HTTP/1.1
Host: hostname
Translate: f
Content-Type: text/plain
Content-Length: 4


The following example uses an instance of the Microsoft.XMLHTTP Component Object Model (COM) class to send a PUT method request to an Exchange store server.


// Note: It is recommended that all input parameters be validated when they are
// first obtained from the user or user interface.
function createItem( uri, vXML ) {

 var Req = new ActiveXObject("Microsoft.XMLHTTP");"PROPPATCH", uri, false);
 if(vXML != "") {
 else {
 return Req;


// This example uses a PUT command to put the stream for an item.
// If the item does not exist, it is created.
function putItemStream( uri, text ){
 var Req = new ActiveXObject("Microsoft.XMLHTTP");"PUT", uri, false);
 if(text != "") {
 else {
 return Req;


The following example uses the PUT method to create a text file in TestFolder1.


#include <stdio.h>
#include <iostream.h>

// If necessary, change the file path if your msxml.dll file is
// in a different location.

#import "c:\windows\system32\msxml.dll"

// To use MSXML 4.0, import the dll msxml4.dll instead of msxml.dll as follows:
// #import "c:\windows\system32\msxml4.dll"
// using namespace MSXML2;

using namespace MSXML;

int main(int argc, char* argv[])

   // Variables.
   MSXML::IXMLHttpRequest* pXMLHttpReq=NULL;
   bstr_t sUrl = "http://server/public/TestFolder1/test1.txt";
   bstr_t sMethod = "PUT";
   _variant_t vUser = L"Domain\\Username";
   _variant_t vPassword = L"!Password";
   _variant_t vAsync = (bool)FALSE;
   long lStatus = 0;
   BSTR bstrResp;
   BSTR bstrResponseText;
   HRESULT hr;

   // Initialize the XMLHTTPRequest object pointer.
   hr = ::CoCreateInstance(__uuidof(XMLHTTPRequest),

   // If you are using MSXML 4.0, use the following to initialize pXMLHttpReq:
   // IXMLHTTPRequestPtr pXMLHttpReq= NULL;
   // HRESULT hr=pXMLHttpReq.CreateInstance("Msxml2.XMLHTTP.4.0");

   // Check the status of pointer creation.
   if (S_OK != hr)
      cout << "XMLHttpRequest pointer creation failed." << endl;
      return 1;

      // Open the XMLHTTPRequest object with the PUT method and
      // specify that it will be sent asynchronously.

      // Set the Content-Type header.
      pXMLHttpReq->setRequestHeader((bstr_t)"Content-Type", (bstr_t)"text/plain");

      // Set Translate header.
      pXMLHttpReq->setRequestHeader((bstr_t)"Translate", (bstr_t)"F");

      bstr_t sReq = "This is a text file.";

      // Send the PUT method request.

      // Get the response status.

      // An error occurred on the server.
      if(lStatus >= 500)
         cout << "Status: " << lStatus << endl
              << "Status text: An error occurred on the server."
              << endl;

         // Display the response status.
         cout << "Status: " << lStatus << endl;

         // Display the response status text.
         cout << "Status text: " << (char*)(bstr_t)bstrResp << endl;

         // Display the response text.
         cout << "Response text: " << (char*)(bstr_t)bstrResponseText << endl;

      // Release the memory.

   catch(_com_error &e)
      // Display the error information.
      cout << "Error code: " << (char*)e.Error() << endl
           << "Error message: " << (char*)e.ErrorMessage()

      // Release the memory.

      return 1;


   return 0;

To create a folder item, use the WebDAV MKCOL Method.

Send us your feedback about the Microsoft Exchange Server 2003 SDK.

Build: June 2007 (2007.618.1)

© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.