如何从同一项目中的另一个 Api 控制器调用 Api 控制器

Alp*_*977 4 c# asp.net-mvc asp.net-core-mvc

我有一个对象“ApplicantDetail”,其中包含 ApplicantController 中的对象列表,我想将发布请求发送到 Personaldetails Api On 以保存到数据库并获取响应

ApplicantController 上的 API

    // POST: api/ApplicantDetail
    [HttpPost]
    [Route("~/api/ApplicantDetail")]
    public IActionResult Post([FromBody] Personaldetail ApplicantDetail)
    {

        Personaldetail personaldetail = new Personaldetail
        {
            Name = ApplicantDetail.Name,
            Cnic = ApplicantDetail.Cnic,
            Phone = ApplicantDetail.Phone
        };

        List<Address> addresses = new List<Address>();
        List<Employee> employees = new List<Employee>();
        List<Bank> banks = new List<Bank>();

        addresses.AddRange(ApplicantDetail.Address);
        employees.AddRange(ApplicantDetail.Employee);
        banks.AddRange(ApplicantDetail.Bank);

        var response = *//How to Call Personaldetail Post APi of PersonaldetailController Controller From Here and Get 
          response back//*

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

个人详细信息控制器上的 API

    // POST: api/Personaldetails
    [HttpPost]
    public async Task<IActionResult> PostPersonaldetail([FromBody] Personaldetail personaldetail)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Personaldetail.Add(personaldetail);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetPersonaldetail", new { id = personaldetail.ApplicantId }, personaldetail);
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 5

您应该创建一个服务类来表示个人详细信息 API。在此类中,您将注入HttpClient,然后IHttpClientFactory使用强类型客户端进行设置:

public class PersonalDetailsService
{
    private readonly HttpClient _client;

    public PersonalDetailsService(HttpClient client)
    {
        _client = client;
    }

    // methods here to interact with API via `_client`
}
Run Code Online (Sandbox Code Playgroud)

然后,在ConfigureServices

services.AddHttpClient<PersonalDetailsService>(c =>
{
    c.BaseAddress = new Uri(Configuration["PersonalDetailsAPIUrl"]);
    // configure anything else you need to on the `HttpClient`
});
Run Code Online (Sandbox Code Playgroud)

最后,在您的控制器中注入PersonalDetailsService

[ApiController]
[Route("api/ApplicantDetail")]
public class ApplicantController
{
    private readonly PersonalDetailsService _personalDetailsService;

    public ApplicantController(PersonalDetailsService personalDetailsService)
    {
        _personalDetailsService = personalDetailsService;
    }

    [HttpPost("")]
    public async Task<IActionResult> Post([FromBody] Personaldetail ApplicantDetail)
    {
        ...

        var response = await _personalDetailsService.SomeMethodAsync(someParam);

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为事情不是这样的。控制器不仅仅是类。它们依赖于请求管道,除非您通过请求“调用”它们,否则事情就无法正常工作。您可以尝试以各种古怪的方式进行补偿,但这只会使您的代码变得更脆弱且更难以维护。此外,它们必须存在于同一个项目中,即使现在存在,也可能并不总是存在。您不想将自己锁定在特定的设计中。 (7认同)
  • 最后,即使它们位于同一个项目中,*正确的*方法是将需要共享的逻辑分解到某种帮助器类中,然后两个控制器都可以使用该类,而不是从另一个控制器调用一个控制器操作。 (3认同)
  • @ChrisPratt——你解释得非常好。当我被问到这个问题时,我通常只是重重地&lt;叹息&gt;。 (2认同)