/// <summary> /// Posts data to the specified method. /// </summary> /// <typeparam name="T">Response output type.</typeparam> /// <param name="methodName">Name of the service method.</param> /// <param name="requestBody">The request body.</param> /// <param name="timeoutSec">The timeout sec.</param> /// <returns>Response's output.</returns> protected void Post(string methodName, object requestBody, int timeoutSec) { IRestRequest request = _httpClient.CreateJsonRequest(methodName, requestBody); _httpClient.Timeout = timeoutSec * 1000; var restResponse = _httpClient.Post(request); CheckServiceResponse(restResponse); }
private bool EnrichAccountData(Guid accountId, SearchInfoRequest requestBody) { var request = _restClient.CreateJsonRequest(SearchMethodName, requestBody); IRestResponse response; try { response = _restClient.Post(request); } catch (Exception ex) { throw new HttpException((int)HttpStatusCode.InternalServerError, ex.Message); } HandleRestClientError(response); SearchInfoResponse responseInfo = ServiceStackTextHelper.Deserialize <SearchInfoResponse>(response.Content); if (responseInfo.Status == "error") { throw new HttpException((int)HttpStatusCode.InternalServerError, responseInfo.Message); } if (responseInfo.CommunicationInfo == null) { var message = $"CommunicationInfo is null. StatusCode = '{response.StatusCode}' " + $"ResponseStatus = '{response.ResponseStatus}' ErrorMessage = '{response.ErrorMessage}' " + $"Content: {response.Content}"; throw new HttpException((int)HttpStatusCode.InternalServerError, message); } bool result = UpdateEnrichedData(accountId, responseInfo.CommunicationInfo); return(result); }
/// <summary> /// Applies batch request for set of emails. /// </summary> /// <param name="emails">List of email entities for processing. Entities must be loaded with /// Id, Body, IsHtmlBody, Sender columns.</param> /// <returns>Dictionary with email as key and found data as value.</returns> /// <exception cref="Terrasoft.Common.ArgumentNullOrEmptyException">Throws when emails are null.</exception> /// <exception cref="IncorrectConfigurationException">Throws if configuration is wrong.</exception> public Dictionary <Entity, GetEmailEntitiesResponse> BatchCall(IEnumerable <Entity> emails) { var result = new Dictionary <Entity, GetEmailEntitiesResponse>(); emails.CheckArgumentNull("emails"); CheckRequiredParameters(out string serviceUrl, out string apiKey); #if NETFRAMEWORK _httpClient.BaseUrl = serviceUrl; #else _httpClient.BaseUrl = new Uri(serviceUrl); #endif _httpClient.Timeout = (int)_requestTimeout.TotalMilliseconds; _httpClient.AddDefaultHeader("ApiKey", apiKey); GetEmailEntitiesRequest[] requests = emails.Select(email => PrepareRequest(email, apiKey)).ToArray(); IRestRequest batchRequest = _httpClient.CreateJsonRequest(ServiceEmailParsingMethod, requests); IRestResponse batchResponse = _httpClient.Post(batchRequest); var batchResponseStatusCode = (int)batchResponse.StatusCode; if (batchResponseStatusCode >= 400 || batchResponseStatusCode == 0) { if (batchResponseStatusCode != 500) { _metricReporter.Gauge(EmailMiningUnreachableMetricName, 1); } switch (batchResponse.StatusCode) { case 0: if (batchResponse.ErrorException is UriFormatException) { throw new IncorrectConfigurationException(EmailMiningConsts.TextParsingServiceSysSetting, serviceUrl, batchResponse.ErrorMessage); } else { _log.ErrorFormat("Request cannot be completed by RestSharp. Error: {0}", batchResponse.ErrorMessage); return(result); } case HttpStatusCode.Unauthorized: throw new IncorrectConfigurationException(CloudServicesAPIKey, apiKey); case HttpStatusCode.NotFound: throw new IncorrectConfigurationException(EmailMiningConsts.TextParsingServiceSysSetting, serviceUrl, "Text Mining service not found"); default: string error = batchResponse.ErrorMessage.IsNullOrEmpty() ? batchResponse.Content : batchResponse.ErrorMessage; _log.ErrorFormat("Cannot process email pack. Response code: {0}({1}). Error: {2}", batchResponse.StatusCode, (int)batchResponse.StatusCode, error); return(result); } } else { _metricReporter.Gauge(EmailMiningUnreachableMetricName, 0); } List <GetEmailEntitiesResponse> responses; try { responses = JsonConvert.DeserializeObject <List <GetEmailEntitiesResponse> >(batchResponse.Content) .ToList(); } catch (JsonSerializationException) { throw new IncorrectConfigurationException(EmailMiningConsts.TextParsingServiceSysSetting, serviceUrl, "OK, but malformed batch response received - Text Mining API version mismatch."); } if (responses.Count != requests.Length) { _log.ErrorFormat( "Batch request corrupted! Number of requests ({0}) is not equal to number of responses ({1}).", requests.Length, responses.Count); return(result); } if (responses.All(response => response.Code == (int)HttpStatusCode.OK && response.TextEntities == null)) { throw new IncorrectConfigurationException(EmailMiningConsts.TextParsingServiceSysSetting, serviceUrl, "OK, but malformed responses received - Text Mining API version mismatch."); } result = emails .Zip(responses, (email, response) => new { email, response }) .ToDictionary(pair => pair.email, pair => pair.response); LogBatchResponseSummary(result); return(result); }