哈囉大家好!
今天要試試看用Controller發送GET request,一樣使用昨天的隨機回傳鴨子圖片的API~
在使用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();
為了方便日後管理,通常會把所有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 |
---|---|
Results.Ok() |
Ok() |
Results.Content() |
Content() |
Results.Redirect() |
Redirect() |
Results.Problem() |
Problem() |
在 Controller 中,這些方法都是繼承自 ControllerBase,而在 Minimal API 中則是使用靜態的 Results 類別。
今天簡單介紹了controller,明天要來試試看發送POST request!