iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0

哈囉大家好!
今天要試試看用Controller發送GET request,一樣使用昨天的隨機回傳鴨子圖片的API~

1. 新增controller service

在使用controller之前,必須在Program.cs檔中註冊Controller服務(透過 builder.Services.AddControllers() 註冊服務到 DI 容器中):

var builder = WebApplication.CreateBuilder(args);

// 註冊 Controller 服務
builder.Services.AddControllers();

var app = builder.Build();

// 啟用 Controller 對應的路由
app.MapControllers();

app.Run();

2. 建立Controller

為了方便日後管理,通常會把所有controller集中放在同一個資料夾中,所以我先建立了一個Controller資料夾,把DuckController.cs檔放在裡面:
註:此處[Route("[controller]")]對應的會是Controller名稱去掉Controller的部分~
例如:DuckController → 對應路由前綴為 duck。

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class DuckController : ControllerBase
{
    [HttpGet("json")] // -> GET duck/json
    public async Task<IActionResult> GetRandomDuckAsync()
    {
        var result = await DuckApiClient.GetRandomDuckAsync();
        return Content(result ?? "{}", "application/json");
        // 或者 return Ok(result); 會自動序列化成 JSON
    }

    [HttpGet("url")] // -> GET duck/url
    public async Task<IActionResult> GetRandomDuckUrlAsync()
    {
        var url = await DuckApiClient.GetRandomDuckUrlAsync();
        return Content(url ?? "No response", "text/plain");
    }

    [HttpGet] // -> GET duck
    public async Task<IActionResult> GetDuckAndRedirectAsync()
    {
        var url = await DuckApiClient.GetRandomDuckUrlAsync();
        if (url is not null)
        {
            return Redirect(url);
        }
        return Problem("No duck found");
    } 
}

在Controller裡,我們可以直接重複利用昨天寫好的 DuckApiClient,只是把 Minimal API 的 app.MapGet() 寫法,改成 Controller 的 action 方法版本。

  • duck/json → 我想要回傳 JSON,所以用 Content(result, "application/json")(或更常見的 Ok(result)
  • duck/url → 直接回傳純文字的 URL,所以用 Content(url, "text/plain")
  • duck → 直接重新導向到鴨子圖片,所以用 Redirect(url)

Minimal API 與 Controller 對照

Minimal API Controller
Results.Ok() Ok()
Results.Content() Content()
Results.Redirect() Redirect()
Results.Problem() Problem()

在 Controller 中,這些方法都是繼承自 ControllerBase,而在 Minimal API 中則是使用靜態的 Results 類別。

學習重點總結

  1. 如何用Controller發送GET request
  2. Minimal API 與 Controller 在回傳方法上的差異

今天簡單介紹了controller,明天要來試試看發送POST request!


上一篇
DAY 6 - 用Minimal API發送GET Request
系列文
30天的旅程!從學習C#到開發小專案7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言