我目前正在与 Personio 集成以获取员工数据。
下面的解决方案没有等待响应,而是在代码中注释的位置突然跳出了第二种方法:
using Personio.Client.Configuration;
using Personio.Client.Exceptions;
using Personio.Client.Models.Data;
using LanguageExt;
using Newtonsoft.Json;
using RestSharp;
namespace Enpal.Personio.Client;
public class PersonioCompanyEmployeesClient
{
private readonly PersonioAuthorizationClient _authorizationClient;
private readonly PersonioConfig _personioConfig;
private readonly RestClient _restClient;
public PersonioCompanyEmployeesClient(PersonioAuthorizationClient authorizationClient, PersonioConfig personioConfig, RestClient restClient)
{
_authorizationClient = authorizationClient;
_personioConfig = personioConfig;
_restClient = restClient;
}
public TryAsync<List<Record>> TryGet(EmployeeRequestOptions options) =>
_authorizationClient.WithAuthorization<List<Record>>(token =>
{
_restClient.BaseUrl = new Uri(_personioConfig.BaseUrl, "/v1/company/employees");
_restClient.Timeout = -1;
IRestRequest request = new RestRequest(Method.GET)
.AddQueryParameter("limit", options.MaximumRecordCount.ToString())
.AddQueryParameter("offset", options.PageOffset.ToString())
.AddHeader("Accept", "application/json")
.AddHeader("Authorization", $"Bearer {token.Value}");
return GetRecordsAsync(request);
});
private async Task<List<Record>> GetRecordsAsync(IRestRequest request)
{
IRestResponse<RecordRequestResponse> requestResponse = await _restClient.ExecuteAsync<RecordRequestResponse>(request);
// Nothing below this line is ever executed!
if (requestResponse.IsSuccessful)
{
RecordRequestResponse? employeesResponse = JsonConvert.DeserializeObject<RecordRequestResponse>(requestResponse.Content);
return (employeesResponse != null && employeesResponse.WasSuccessful)
? employeesResponse.Records
.ToList()
: throw new PersonioRequestException("Connected to Personio, but could not get records.");
}
else
{
throw (requestResponse.ErrorException != null)
? new PersonioRequestException("Could not get records from Personio.", requestResponse.ErrorException)
: new PersonioRequestException("Could not get records from Personio. Reason unknown.");
}
}
}
但是,我可以使用同步方法使这个解决方案工作,如下所示:
public TryAsync<List<Record>> TryGet(EmployeeRequestOptions options) =>
_authorizationClient.WithAuthorization<List<Record>>(token =>
{
_restClient.BaseUrl = new Uri(_personioConfig.BaseUrl, "/v1/company/employees");
_restClient.Timeout = -1;
IRestRequest request = new RestRequest(Method.GET)
.AddQueryParameter("limit", options.MaximumRecordCount.ToString())
.AddQueryParameter("offset", options.PageOffset.ToString())
.AddHeader("Accept", "application/json")
.AddHeader("Authorization", $"Bearer {token.Value}");
return GetRecordsAsync(request);
});
private async Task<List<Record>> GetRecordsAsync(IRestRequest request)
{
IRestResponse<RecordRequestResponse> requestResponse = await _restClient.ExecuteAsync<RecordRequestResponse>(request);
if (requestResponse.IsSuccessful)
{
RecordRequestResponse? employeesResponse = JsonConvert.DeserializeObject<RecordRequestResponse>(requestResponse.Content);
return (employeesResponse != null && employeesResponse.WasSuccessful)
? employeesResponse.Records
.ToList()
: throw new PersonioRequestException("Connected to Personio, but could not get records.");
}
else
{
throw (requestResponse.ErrorException != null)
? new PersonioRequestException("Could not get records from Personio.", requestResponse.ErrorException)
: new PersonioRequestException("Could not get records from Personio. Reason unknown.");
}
}
唯一的变化:
GetRecords()
使用Execute
而不是ExecuteAsync
GetRecords()
返回List<Record>
而不是Task<List<Record>>
TryGet()
GetRecordsAsync(request)
在Task.FromResult()
返回之前包裹。