public string GetResponse(string uri, string data = "", RequestMethods method = RequestMethods.GET) { System.Diagnostics.Trace.WriteLine(uri); // create request HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.PreAuthenticate = true; request.Method = method.ToString().ToUpper(); request.ContentType = "application/x-www-form-urlencoded"; // log in string authInfo = API_KEY + ":" + ""; // blank password authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); request.Headers["Authorization"] = "Basic " + authInfo; // send data if (data != "") { byte[] paramBytes = Encoding.ASCII.GetBytes(data); request.ContentLength = paramBytes.Length; Stream reqStream = request.GetRequestStream(); reqStream.Write(paramBytes, 0, paramBytes.Length); reqStream.Close(); } // get response try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return new StreamReader(response.GetResponseStream()).ReadToEnd(); } catch (WebException ex) { HttpWebResponse response = ((HttpWebResponse)ex.Response); throw new Exception(uri + " caused a " + (int)response.StatusCode + " error.\n" + response.StatusDescription); } }
/// <summary> /// Perform generic API calling /// </summary> /// <param name="methodURL">IssueTracker method URL</param> /// <param name="data">Generic data</param> /// <param name="attachments">List of file paths (optional)</param> /// <param name="update">flag to indicate if this is a PUT operation</param> /// <returns>the JSON string returned from server</returns> private string api(string methodURL, RequestMethods request_method, List<KeyValuePair<string, string>> data = null, List<string> attachments = null) { string url = baseURL + methodURL; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Headers.Add("Authorization: Basic " + auth); request.Method = request_method.ToString(); if (data != null || attachments != null) { byte[] formData = null; if (attachments == null) { request.ContentType = "application/x-www-form-urlencoded"; var postParams = new List<string>(); foreach (KeyValuePair<string, string> item in data) { postParams.Add(String.Format("{0}={1}", item.Key, Uri.EscapeUriString(item.Value))); } string postQuery = String.Join("&", postParams.ToArray()); formData = Encoding.UTF8.GetBytes(postQuery); request.ContentLength = formData.Length; using (var requestStream = request.GetRequestStream()) { requestStream.Write(formData, 0, formData.Length); requestStream.Flush(); } } else { var boundary = "------------------------" + DateTime.Now.Ticks; var newLine = Environment.NewLine; request.ContentType = "multipart/form-data; boundary=" + boundary; using (var requestStream = request.GetRequestStream()) { #region Stream data to request var fieldTemplate = newLine + "--" + boundary + newLine + "Content-Type: text/plain" + newLine + "Content-Disposition: form-data;name=\"{0}\"" + newLine + newLine + "{1}"; var fieldData = ""; foreach (KeyValuePair<string, string> item in data) { fieldData += String.Format(fieldTemplate, item.Key, item.Value); } var fieldBytes = Encoding.UTF8.GetBytes(fieldData); requestStream.Write(fieldBytes, 0, fieldBytes.Length); #endregion #region Stream files to request var fileInfoTemplate = newLine + "--" + boundary + newLine + "Content-Disposition: filename=\"{0}\"" + newLine + "Content-Type: {1}" + newLine + newLine; foreach (var path in attachments) { using (var reader = new BinaryReader(File.OpenRead(path))) { #region Stream file info var fileName = Path.GetFileName(path); var fileInfoData = String.Format(fileInfoTemplate, fileName, getMimeType(fileName)); var fileInfoBytes = Encoding.UTF8.GetBytes(fileInfoData); requestStream.Write(fileInfoBytes, 0, fileInfoBytes.Length); #endregion #region Stream file using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[4096]; var fileBytesRead = 0; while ((fileBytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { requestStream.Write(buffer, 0, fileBytesRead); } } #endregion } } var trailer = Encoding.ASCII.GetBytes(newLine + "--" + boundary + "--"); requestStream.Write(trailer, 0, trailer.Length); #endregion } } } try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { return reader.ReadToEnd(); } } } } catch (WebException wex) { var response = (HttpWebResponse)wex.Response; string message = "An API error occurred."; if (response == null) { throw new APIException(message, null); } var code = response.StatusCode; using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { message = reader.ReadToEnd(); } } throw new APIException(message, response); } catch (Exception e) { return e.Message; } }