c# - 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()}");
}
}
如何从表单应用程序的异常中获取正确的详细信息?
解决方案
这是我正在使用的。
请注意,在调用 之后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; } = "";
}
推荐阅读
- google-maps - Google Cloud Platform 中“错误”图的含义
- axis - OxyPlot:在 LinearColorAxis 上显示最大值/最小值的标签
- javascript - 为什么函数必须被调用两次才能更新钩子状态?
- r - 我如何把它变成一个函数?
- ios - Ionic 3 Video 在 IOS 13.3 中播放 1 秒后暂停
- c++ - 从字符串流中读取具有特定字段宽度的 int
- docker - 使用 docker compose 创建了 apache 服务,但无法通过浏览器访问 apache(httpd)
- python - 如何创建加权图?
- r - 在R中将两个“lm”对象合并为一个
- soap - 空手道 - 如何写入用作特征文件输入的同一 CSV 文件