首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Acumatica REST API异常消息

Acumatica REST API异常消息
EN

Stack Overflow用户
提问于 2020-06-23 02:43:24
回答 1查看 289关注 0票数 0

我正在使用Acumatica REST API开发一个Windows窗体应用程序。我正在致力于错误处理,并希望为用户提供有意义的错误消息。我注意到,当我使用PostMan进行测试时,我可以使用错误消息对异常进行内部处理。

代码语言:javascript
运行
复制
{
  "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个错误。内部异常为空。

代码语言:javascript
运行
复制
System.Net.Http.HttpRequestException: Response status code does not indicate success: 500 (Internal Server Error).
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()

我的put代码如下所示:

代码语言:javascript
运行
复制
 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()}");
        }
    }

如何从forms应用程序中的异常中获取适当的详细信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-02 22:06:56

这是我正在使用的。

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

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

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

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

代码语言:javascript
运行
复制
        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;
        }

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

代码语言:javascript
运行
复制
    public class ResponseMessage
    {
        public string exceptionMessage { get; set; } = "";
        public string message { get; set; } = "";
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62521361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档