title: Create a folder in SP2013 using REST and HTTPClient
body: <p>I am trying to create a folder in SP2013 using HTTPClient and REST. </p>
  
  <p>The following are the requirements &amp; constraints on the application</p>
  
  <ol>
  <li><p>I need to create a folder in a 2013 document library using REST. CSOM is not allowed.</p></li>
  <li><p>The program must be a C# Console Application.</p></li>
  <li><p>I MUST use HTTPClient ONLY to make all calls to web service. No other old class or library should be used.</p></li>
  <li><p>Integrated authentication is a MUST. you must not type in your user name and password here in code. it must use the identity of the process.</p></li>
  </ol>
  
  <p>Based on these constraints I wrote this code</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using System.Net.Http;
  using System.Net.Http.Headers;
  using System.Net.Http.Formatting;
  using Newtonsoft.Json;
  using Newtonsoft.Json.Linq;
  
  namespace RESTCreateFolder
  {
      class Program
      {
          static void Main(string[] args)
          {
              Program p = new Program();
              int retVal = p.Process().Result;            
          }
  
          private async Task&lt;int&gt; Process()
          {
              string url = "http://bi.abhi.com/testweb/";
              using (HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
              {
                  client.BaseAddress = new System.Uri(url);
                  client.DefaultRequestHeaders.Add("Accept", "application/json; odata=verbose");
                  string digest = await GetDigest(client);
                  Console.WriteLine("Digest " + digest);
                  try
                  {
                      await CreateFolder(client, digest);
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine(ex.Message);
                      Console.WriteLine(ex.StackTrace);
                  }
              }
              return 0;
          }
  
          private object CreateRequest(string folderPath)
          {
              var type = new { type = "SP.Folder" };
              var request = new { __metadata = type, ServerRelativeUrl = folderPath };
              return request;
          }
  
          private async Task CreateFolder(HttpClient client, string digest)
          {
              client.DefaultRequestHeaders.Add("X-RequestDigest", digest);
              var request = CreateRequest("/test/foo");
              string json = JsonConvert.SerializeObject(request);
              StringContent strContent = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
              strContent.Headers.ContentLength = json.Length;
              HttpResponseMessage response = await client.PostAsync("_api/web/folders", strContent);
              //response.EnsureSuccessStatusCode();
              if (response.IsSuccessStatusCode)
              {
                  string content = await response.Content.ReadAsStringAsync();
                  Console.WriteLine(content);
              }
              else
              {
                  Console.WriteLine(response.StatusCode);
                  Console.WriteLine(response.ReasonPhrase);
                  string content = await response.Content.ReadAsStringAsync();
                  Console.WriteLine(content);
              }
          }
  
          public async Task&lt;string&gt; GetDigest(HttpClient client)
          {
              string retVal = null;
              string cmd = "_api/contextinfo";                       
              HttpResponseMessage response = await client.PostAsJsonAsync(cmd, "");
              if (response.IsSuccessStatusCode)
              {
                  string content = await response.Content.ReadAsStringAsync();
                  JToken t = JToken.Parse(content);
                  retVal = t["d"]["GetContextWebInformation"]["FormDigestValue"].ToString();
              }
              return retVal;
          }
      }
  }
  </code></pre>
  
  <p>But this code keeps failing with BAD REQUEST.</p>
  
  <p>Can you make "this" code work and let me know how you fixed it. I found many articles on MSDN but they all use the OLD approach of WebRequest which I cannot use. I must use HttpClient.</p>
  
  <p>EDIT:: </p>
  
  <p>Here is the raw request captured from fiddler</p>
  
  <pre><code>POST http://bi.abhi.com/testweb/_api/web/folders HTTP/1.1
  Accept: application/json; odata=verbose
  X-RequestDigest: 0x8B2A0904D5056E49DB886A72D59A86264A000F9AB14CE728407ECCD6F4369A7AD2585967BE9A57085344A5ACC99A4DA61D59E5EFA9A54B9B83564B2EA736F7F4,21 Aug 2014 20:24:15 -0000
  Content-Type: application/json; charset=utf-8
  Host: bi.abhi.com
  Content-Length: 67
  Expect: 100-continue
  
  {"__metadata":{"type":"SP.Folder"},"ServerRelativeUrl":"/test/foo"}
  </code></pre>
  
  <p>Here is the raw response from fiddler</p>
  
  <pre><code>HTTP/1.1 400 Bad Request
  Cache-Control: private, max-age=0
  Transfer-Encoding: chunked
  Content-Type: application/json;odata=verbose;charset=utf-8
  Expires: Wed, 06 Aug 2014 20:24:15 GMT
  Last-Modified: Thu, 21 Aug 2014 20:24:15 GMT
  Server: Microsoft-IIS/8.0
  X-SharePointHealthScore: 0
  SPClientServiceRequestDuration: 4
  X-AspNet-Version: 4.0.30319
  SPRequestGuid: a9c6b09c-9340-10e2-0000-093d0491623a
  request-id: a9c6b09c-9340-10e2-0000-093d0491623a
  X-RequestDigest: 0x8B2A0904D5056E49DB886A72D59A86264A000F9AB14CE728407ECCD6F4369A7AD2585967BE9A57085344A5ACC99A4DA61D59E5EFA9A54B9B83564B2EA736F7F4,21 Aug 2014 20:24:15 -0000
  X-FRAME-OPTIONS: SAMEORIGIN
  X-Powered-By: ASP.NET
  MicrosoftSharePointTeamServices: 15.0.0.4569
  X-Content-Type-Options: nosniff
  X-MS-InvokeApp: 1; RequireReadOnly
  Date: Thu, 21 Aug 2014 20:24:14 GMT
  
  e6
  {"error":{"code":"-1, System.InvalidOperationException","message":{"lang":"en-US","value":"The required version of WcfDataServices is missing. Please refer to http://go.microsoft.com/fwlink/?LinkId=321931 for more information."}}}
  0
  </code></pre>
  
  <p>I have patched my server environment completely and there are no new updates to apply. so I don't know why it says the required wcfdata services is missing.</p>