首页 > 解决方案 > Acumatica REST API 异常消息

问题描述

我正在使用 Acumatica REST API 开发 Windows 窗体应用程序。我正在处理错误,并希望向用户呈现有意义的错误消息。我注意到,当我使用 PostMan 进行测试时,我可以在异常中包含错误消息。

{
  "message": "An error has occurred.",
  "exceptionMessage": "Opportunity.ClassID: 'Class ID' cannot be found in the system.\nInserting  'Opportunity' record raised at least one error. Please review the errors.",
  "exceptionType": "PX.Api.ContractBased.OutcomeEntityHasErrorsException",
  "stackTrace": "   at PX.Api.ContractBased.EntityService.GetOperationResult(EntityImpl entity, 

  ...
  ...
}

但是,当我在 C# 中使用 HttpClient 时,我只会收到基本的 500 错误。内部异常为空。

System.Net.Http.HttpRequestException: Response status code does not indicate success: 500 (Internal Server Error).
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()

我的放置代码如下所示:

 public string Put(string entityName, string parameters, string entity)
    {
        try
        {
            var res = _httpClient.PutAsync(
                 _acumaticaAPI + entityName + "?" + parameters,
                new StringContent(entity, Encoding.UTF8, "application/json")).Result.EnsureSuccessStatusCode();

            return res.Content.ReadAsStringAsync().Result;
        }
        catch(HttpRequestException ex)
        {
            throw new HttpRequestException($"API PUT Error: {ex.ToString()}");
        }
    }

如何从表单应用程序的异常中获取正确的详细信息?

标签: c#winformspostmanacumatica

解决方案


这是我正在使用的。

请注意,在调用 之后client.PutAsync(),我没有使用.Result.EnsureSuccessStatusCode();语法。

我在用var response = await client.PutAsync(uri, stringContent);

之后,我检查响应代码,如果不成功,我会继续获取响应,以便通过err = await response.Content.ReadAsStringAsync();.

我正在使用 NewtownSoft 并将错误响应反序列化为我调用的类ResponseMessage

        public async Task<T> PutData<T>(T data, string entity)
        {
            err = "";
            msg = new ResponseMessage();

            T respData = default(T);

            if (await Login() == false) return respData;

            var uri = new Uri(settings.url + settings.endpoint + entity); 
            try
            {
                var json = JsonConvert.SerializeObject(data);
                var stringContent = new StringContent(json, Encoding.UTF8, "application/json");

                var response = await client.PutAsync(uri, stringContent);
                
                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();
                    
                    respData = JsonConvert.DeserializeObject<T>(content);
                }
                else
                {
                    err = await response.Content.ReadAsStringAsync();
                    

                    try
                    {
                        msg = JsonConvert.DeserializeObject<ResponseMessage>(err);
                        if (msg != null) err = msg.exceptionMessage == "" ? msg.message : msg.exceptionMessage;
                        return respData;
                    }
                    catch (Exception ex)
                    {
                        err = ex.Message;
                        msg.exceptionMessage = ex.Message;
                        return respData;
                    }

                }

            }
            catch (Exception ex)
            {
                err = ex.Message;
                return respData;
            }

            return respData;
        }

它将响应反序列化为以下类

    public class ResponseMessage
    {
        public string exceptionMessage { get; set; } = "";
        public string message { get; set; } = "";
    }

推荐阅读