Acumatica REST API 异常消息
Acumatica REST API Exception Messages
我正在使用 Acumatica REST API 开发 Windows Forms 应用程序。我正在处理错误并希望向用户显示有意义的错误消息。我注意到,当我使用 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 并将错误响应反序列化为 class 我调用 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;
}
它将响应反序列化为以下内容class
public class ResponseMessage
{
public string exceptionMessage { get; set; } = "";
public string message { get; set; } = "";
}
我正在使用 Acumatica REST API 开发 Windows Forms 应用程序。我正在处理错误并希望向用户显示有意义的错误消息。我注意到,当我使用 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 并将错误响应反序列化为 class 我调用 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;
}
它将响应反序列化为以下内容class
public class ResponseMessage
{
public string exceptionMessage { get; set; } = "";
public string message { get; set; } = "";
}