Hello,
Would anyone have an example of how they are sending PATCH requests to Creatio?
Apparently this does not work, I get the error "{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}"
public static void UpdateThingInCreatio(string section, Guid object, Guid idofyetanotherobject, string text1, string text2) { string data = " somedata"; string requestUri = serverUri + "ActivityCollection(guid'" + objectUID + "')"; Encoding encoding = Encoding.Default; var request = WebRequest.Create(requestUri) as HttpWebRequest; request.Method = "PATCH"; request.ContentType = "application/json; charset=utf-8"; request.Credentials = new NetworkCredential(username, password); byte[] buffer = encoding.GetBytes(data); Stream dataStream = request.GetRequestStream(); dataStream.Write(buffer, 0, buffer.Length); dataStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string result = ""; using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default)) { result = reader.ReadToEnd(); } MessageBox.Show(dataStream.ToString());
Have looked here: https://documenter.getpostman.com/view/10204500/SztHX5Qb?version=latest#78ea2d20-a8a5-4293-8aa5-0fa694d14d33
here:https://community.creatio.com/taxonomy/term/5162
and here: https://academy.creatio.com/documents/technic-sdk/7-16/integrations-and-external-api
with no luck.
Any suggestions or code snipit's are welcome!
Like
Solved it doing something along the lines of this:
using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(//Auth here); using (var request = new HttpRequestMessage(new HttpMethod("PATCH"), requestUri)) { request.Headers.TryAddWithoutValidation("Accept", "application/json; odata=verbose"); request.Headers.TryAddWithoutValidation("ForceUseSession", "true"); request.Headers.TryAddWithoutValidation("BPMCSRF", "value"); request.Content = new StringContent("data"); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json; odata=verbose"); var response = await httpClient.SendAsync(request); } }
If there are any other examples the community would like to share please do here!
Dear Philip,
Please find the example of the code below:
ExternalRequest.cs
using System; using System.Net; using System.IO; using System.Collections.Generic; namespace ThirdPartyIntegration { class ExternalRequest { #region Fields: Private private readonly string appUrl = "http://localhost:3030/"; private readonly string authServiceUrl = "ServiceModel/AuthService.svc/Login"; private readonly string OData3ServiceUrl = "0/ServiceModel/EntityDataService.svc/"; private CookieContainer authCookie = new CookieContainer(); #endregion #region Methods: Private private HttpWebRequest CreateRequest(string url, string methodType, string requestData = null) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "application/json;"; request.Method = methodType; request.Accept = "application/json;"; //request.KeepAlive = true; if (!string.IsNullOrEmpty(requestData)) { using (var requestStream = request.GetRequestStream()) { using (var writer = new StreamWriter(requestStream)) { writer.Write(requestData); } } } return request; } // Method realizes protection from CSRF attacks: copies cookie, which contents CSRF-token // and pass it to the header of the next request. private void AddCsrfToken(HttpWebRequest request) { var cookie = request.CookieContainer.GetCookies(new Uri(appUrl))["BPMCSRF"]; if (cookie != null) { request.Headers.Add("BPMCSRF", cookie.Value); } } private string GenerateRequestData(IDictionary<string, string> columnValuesPairs) { List<string> data = new List<string>(); foreach (var pairs in columnValuesPairs) { data.Add($"\"{pairs.Key}\": \"{pairs.Value}\""); } var massData = data.ToArray(); return "{ " + string.Join(", ", massData) + " }"; } #endregion #region Methods: Public public void TryLogin(string userName, string userPassword) { var authData = "{ " + $"\"UserName\": \"{userName}\", \"UserPassword\": \"{userPassword}\"" + " }"; var request = CreateRequest(appUrl + authServiceUrl, "POST", authData); request.CookieContainer = authCookie; // Upon successful authentication, we save authentication cookies for // further use in requests to Creatio. In case of failure // authentication application console displays a message about the reason // of the mistake. using (var response = (HttpWebResponse)request.GetResponse()) { using (var reader = new StreamReader(response.GetResponseStream())) { var responseMessage = reader.ReadToEnd(); if (response.StatusCode == HttpStatusCode.OK) { Console.WriteLine(responseMessage); if (responseMessage.Contains("\"Code\":1")) { throw new UnauthorizedAccessException($"Unauthorized {userName} for {appUrl}"); } string authName = ".ASPXAUTH"; string authCookieValue = response.Cookies[authName].Value; authCookie.Add(new Uri(appUrl), new Cookie(authName, authCookieValue)); Console.WriteLine(responseMessage); } else { Console.WriteLine(response.StatusCode + responseMessage); } } } } public void PatchRequestCreatio(string objectName, Guid objectId, IDictionary<string, string> columnValuesPairs) { string requestData = GenerateRequestData(columnValuesPairs); string finalUrl = appUrl + OData3ServiceUrl + objectName + "Collection(guid'" + objectId + "')"; var request = CreateRequest(finalUrl, "PATCH", requestData); request.ContentType += " odata=verbose"; request.Accept += " odata=verbose"; request.Headers.Add("ForceUseSession", "true"); request.CookieContainer = authCookie; AddCsrfToken(request); using (var response = (HttpWebResponse)request.GetResponse()) { using (var reader = new StreamReader(response.GetResponseStream())) { var responseMessage = reader.ReadToEnd(); } } } #endregion } }
Program.cs
using System; using System.Collections.Generic; namespace ThirdPartyIntegration { class Program { static void Main(string[] args) { ExternalRequest request = new ExternalRequest(); request.TryLogin("UserName", "UserPassword"); string @object = "Account"; Guid objectId = new Guid("405947D0-2FFB-4DED-8675-0475F19F5A81"); Dictionary<string, string> keyValuePairs = new Dictionary<string, string>(); keyValuePairs.Add("Fax", "Test"); keyValuePairs.Add("Code", "111"); request.PatchRequestCreatio(@object, objectId, keyValuePairs); } } }
Best regards,
Norton