iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
自我挑戰組

跟 AI Agent 變成好朋友系列 第 28

【Day28】AI Agent 魔法詠唱 - Controller (API 控制器)

  • 分享至 

  • xImage
  •  

如同常見的專案架構,Controller 作為 Spring Boot 應用程式中的 REST API 控制器,負責接收前端請求、呼叫 Service,並將結果回傳給前端。以 AIRecommendationController 為例:

@RestController
@RequestMapping("/api/recommendations")
@CrossOrigin(origins = "*")
public class AIRecommendationController {
    
    @Autowired
    private AIRecommendationService aiRecommendationService;
    
    @Autowired
    private UserPreferenceService userPreferenceService;
    
    @Autowired
    private BedrockAIService bedrockAIService;
    
    @PostMapping("/generate")
    public ResponseEntity<RecommendationResponse> generateRecommendation(
            @Valid @RequestBody RecommendationRequest request) {
        
        try {
            RecommendationResponse response = aiRecommendationService.generateRecommendation(
                request.getUserInput(), request.getUsername());
            
            // 分析並更新使用者偏好(如果有使用者名稱)
            System.out.println("Request Username: " + request.getUsername());
            System.out.println("Response Recommendations: " + response.getRecommendations());
            if (request.getUsername() != null && !request.getUsername().isEmpty() && 
                response.getRecommendations() != null) {
                
                List<String> recommendedDrinkNames = response.getRecommendations().stream()
                    .map(RecommendationResponse.DrinkRecommendation::getName)
                    .toList();
                
                userPreferenceService.analyzeAndUpdatePreferences(
                    request.getUsername(), request.getUserInput(), recommendedDrinkNames);
            }
            
            return ResponseEntity.ok(response);
            
        } catch (Exception e) {
            return ResponseEntity.badRequest()
                .body(RecommendationResponse.error("推薦生成失敗:" + e.getMessage()));
        }
    }
    
    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("AI Recommendation API is working!");
    }
    
    @GetMapping("/service-status")
    public ResponseEntity<Map<String, Object>> getServiceStatus() {
        Map<String, Object> status = new HashMap<>();
        status.put("serviceType", bedrockAIService.getCurrentServiceType());
        status.put("isBedrockAvailable", bedrockAIService.isBedrockConfigured());
        status.put("timestamp", java.time.LocalDateTime.now());
        return ResponseEntity.ok(status);
    }
}

主要結構説明:

  1. Controller 以 @RestController 標註,表示回傳 JSON 格式資料,並以 /api/recommendations 為路徑前綴。
  2. 透過 @Autowired 注入三個 Service,分別負責 AI 推薦內容生成、使用者偏好分析、Bedrock AI 狀態查詢。
  3. generateRecommendation 方法處理前端 POST 請求,接收推薦請求資料,呼叫 AIRecommendationService 產生推薦結果。若有使用者名稱,則進一步呼叫 UserPreferenceService 分析並更新偏好。
  4. 一但推薦過程發生例外,則回傳錯誤訊息。
  5. test 方法則提供 API 健康檢查,回傳簡單訊息。
  6. getServiceStatus 方法可以直接查詢 Bedrock AI 服務狀態,回傳目前服務型態、是否可用及時間戳記。

如此一來,Controller 只要負責接收 HTTP 請求,將資料傳給 Service 處理,並將結果(或錯誤)包裝成 ResponseEntity 回傳前端,就能實現前後端分離的架構。


上一篇
【Day27】AI Agent 魔法詠唱 - UserPreference Service
下一篇
【Day29】AI Agent 魔法詠唱 - 前端整合
系列文
跟 AI Agent 變成好朋友30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言