我正在使用分层 ABP 框架版本 7。
我想从 localhos:6767
url 调用外部
REST API服务。
外部应用程序也使用 swagger,所以我确切地知道数据应该如何构造。
问: 仅在应用层调用和使用 REST API 的最佳实践是什么,而不向我的项目添加额外的块包?
请注意,我已经检查了 documentation 。然而,遵循这一点并不容易。如果可以的话,请提供一个简单的例子。
由于一年来没有提供答案,我想提供我的简单解决方案(以防其他人偶然发现这个问题)。
我已经为请求和响应创建了一个 DTO,参考 swagger。 然后我基本上使用旧的 HttpClient 通过 REST 发送和接收数据。
这是一个示例方法:
public async Task<InvoiceDto> CeateInvoiceOverRpc(CreateInvoiceDto input, int frm, bool vatIncluded)
{
using var client = new HttpClient();
try
{
string URL = BaseURL + $"/api/app/invoices/new-invoice-with-params?firm={frmNo.ToString()}&vatIncluded={vatIncluded}";
var json = JsonSerializer.Serialize(input);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(URL, content);
if (!response.IsSuccessStatusCode)
{
var errorResponse = await response.Content.ReadFromJsonAsync<ErrorResponse>();
_logger.LogError("Error on REST API call: Code={Code}, Message={Message}, Details={Details}",
errorResponse.Error.Code,
errorResponse.Error.Message,
errorResponse.Error.Details);
throw new UserFriendlyException(
$"Message: {errorResponse.Error.Message}, InvoiceNumber: {input.InvoiceNumber}, Frm: {frmNo}, " +
$"Code: {errorResponse.Error.Code}, Details: {errorResponse.Error.Details}. "
);
}
response.EnsureSuccessStatusCode();
var responseData = await response.Content.ReadFromJsonAsync<SayimFicheWithExtraDetail>();
return responseData;
}
catch (HttpRequestException ex)
{
_logger.LogError(ex, "An HttpRequestException occurred while sending the request.");
throw new UserFriendlyException(
$"An HttpRequestException occurred while sending the request. InvoiceNumber: {input.InvoiceNumber}, Frm: {frmNo}, "
);
}
catch (Exception ex)
{
_logger.LogError(ex, "An unexpected error occurred.");
throw new UserFriendlyException(
$"An unexpected error occurred" +
$"--> {ex.Message} "
);
}
}