Я использую Refit package на .NET MAUI проекте, чтоб организовать удобный доступ к серверу для авторизованного юзера. Сервер у меня - ASP.NET Web Api. Я пока ещё в нём только осваиваюсь, поэтому не знаю всех тонкостей. Делал всё по примеру с ютуба, по идее, должно было сработать:
Тут происходит отправка запроса с учётом токена:
public class FirebaseAuthHttpMessageHandler : DelegatingHandler
{
private readonly IGoogleAuthenticationService _googleAuthenticationService;
public FirebaseAuthHttpMessageHandler(IGoogleAuthenticationService googleAuthenticationService)
{
_googleAuthenticationService = googleAuthenticationService;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
string? firebaseToken = await _googleAuthenticationService.GetFreshToken();
if (firebaseToken != null)
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", firebaseToken);
return await base.SendAsync(request, cancellationToken);
}
}
Мой Query:
public interface IGetSummaryFromChatGPTQuery
{
[Post("/api/openai/summary")]
Task<SummaryRequest> Execute([Body] SummaryRequest request);
}
С помощью Dependency Injection в проект подгружаю всё это дело:
builder.Services.AddTransient<FirebaseAuthHttpMessageHandler>();
builder.Services.AddRefitClient<IGetSummaryFromChatGPTQuery>().
ConfigureHttpClient(c => c.BaseAddress = new Uri(serverBaseURL)).
AddHttpMessageHandler<FirebaseAuthHttpMessageHandler>();
Модель для отправки и получения данных:
public class SummaryRequest
{
public string Content { get; set; } = string.Empty;
public string Result { get; set; } = string.Empty;
public string Error { get; set; } = string.Empty;
}
Сервис, где происходит запрос с помощью Query:
public class OpenAIAPIRequestService : IOpenAIAPIRequestService
{
private readonly IGetSummaryFromChatGPTQuery _getSummaryFromChatGPTQuery;
public OpenAIAPIRequestService(
IGetSummaryFromChatGPTQuery getSummaryFromChatGPTQuery)
{
_getSummaryFromChatGPTQuery = getSummaryFromChatGPTQuery;
}
public async Task<SummaryRequest> GetSummaryAsync(string content)
{
var requestData = new SummaryRequest
{
Content = content
};
SummaryRequest response;
try
{
response = await _getSummaryFromChatGPTQuery.Execute(requestData);
if (!string.IsNullOrWhiteSpace(response.Error))
throw new Exception(response.Error);
}
catch (Exception)
{
throw;
}
return response;
}
}
Program.cs сервера:
using Data_Organizer_Server.Interfaces;
using Data_Organizer_Server.Services;
using FirebaseAdmin;
using FirebaseAdminAuthentication.DependencyInjection.Extensions;
using Google.Apis.Auth.OAuth2;
namespace Data_Organizer_Server
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddAuthorization();
builder.Services.AddSingleton(FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.FromJson(builder.Configuration.GetValue<string>("FIREBASE_CONFIG"))
}));
builder.Services.AddFirebaseAuthentication();
builder.Services.AddScoped<IOpenAIService, OpenAIService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}
Контроллер:
using Data_Organizer_Core;
using Data_Organizer_Server.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Data_Organizer_Server.Controllers
{
[Authorize]
[ApiController]
[Route("api/openai")]
public class OpenAIController : ControllerBase
{
private readonly IOpenAIService _openAIService;
public OpenAIController(IOpenAIService openAIService)
{
_openAIService = openAIService;
}
[HttpPost("summary")]
public async Task<IActionResult> GetSummary([FromBody] SummaryRequest request)
{
if (request == null || string.IsNullOrWhiteSpace(request.Content))
{
return BadRequest("Порожній запит або відсутній контент!");
}
try
{
request.Result = await _openAIService.GetSummary(request.Content);
return Ok(request);
}
catch (Exception ex)
{
request.Error = ex.Message;
return StatusCode(500, request);
}
}
}
}
Ошибка, которая появляется: System.Net.Http.HttpRequestException: 'Connection failure'.
При этом с Postman запросы идут нормально, приходят с ответом. То есть, в теории, проблема не на стороне сервера. Хотя не уверен, в теме Web API я тоже новичок...
Если будут вопросы, то спрашивайте! Буду рад и благодарен, если поможете разобраться.