/// <summary> /// Makes a POST request to the Facebook API. If the <code>AccessToken</code> property has /// been specified, the access token will be appended to the query string. /// </summary> /// <param name="url">The URL to call.</param> /// <param name="query">The query string of the request.</param> /// <param name="postData">The POST data.</param> /// <param name="isMultipart">If <code>true</code>, the content type of the request will be <code>multipart/form-data</code>, otherwise <code>application/x-www-form-urlencoded</code>.</param> /// <returns>Returns an instance of <code>SocialHttpResponse</code> wrapping the response from the Facebook Graph API.</returns> public SocialHttpResponse DoAuthenticatedPostRequest(string url, SocialQueryString query, SocialPostData postData, bool isMultipart) { // Throw an exception if the URL is empty if (String.IsNullOrWhiteSpace(url)) throw new ArgumentNullException("url"); // Append the HTTP scheme and API version if not already specified. if (url.StartsWith("/")) { url = "https://graph.facebook.com" + (String.IsNullOrWhiteSpace(Version) ? "" : "/" + Version) + url; } // Initialize a new instance of SocialQueryString if the one specified is NULL if (query == null) query = new SocialQueryString(); // Append the access token to the query string if present in the client and not already // specified in the query string if (!query.ContainsKey("access_token") && !String.IsNullOrWhiteSpace(AccessToken)) { query.Add("access_token", AccessToken); } // Append the query string to the URL if (!query.IsEmpty) url += (url.Contains("?") ? "&" : "?") + query; // Initialize a new HTTP request HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); // Set the HTTP method request.Method = "POST"; // Write the POST data to the request stream if (postData != null && postData.Count > 0) { if (isMultipart) { string boundary = Guid.NewGuid().ToString().Replace("-", ""); request.ContentType = "multipart/form-data; boundary=" + boundary; using (Stream stream = request.GetRequestStream()) { postData.WriteMultipartFormData(stream, boundary); } } else { string dataString = postData.ToString(); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = dataString.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(Encoding.UTF8.GetBytes(dataString), 0, dataString.Length); } } } // Get the HTTP response try { return SocialHttpResponse.GetFromWebResponse(request.GetResponse() as HttpWebResponse); } catch (WebException ex) { if (ex.Status != WebExceptionStatus.ProtocolError) throw; return SocialHttpResponse.GetFromWebResponse(ex.Response as HttpWebResponse); } }