昨天的 Day 6,我們學會了使用 @RequestParam 接收使用者從網址傳進來的資料。
例如:
/hello?name=Hannie
Spring Boot 可以取得:
name = Hannie
既然已經會接收資料了,今天終於可以開始做第一個真正跟「健康」有關的功能!
今天的目標是:
讓使用者輸入身高與體重,再由 Java 自動計算 BMI。
也就是把網址變成:
/bmi?height=162&weight=50
然後讓 Spring Boot 告訴我們 BMI 是多少。
終於開始有一點健康助理的樣子了 XD
BMI 的全名是:
Body Mass Index
中文通常稱為「身體質量指數」。
它是利用身高與體重計算出來的一個數值。
公式是:
BMI = 體重(kg) ÷ 身高²(m²)
例如:
身高 = 162 cm
體重 = 50 kg
因為公式中的身高單位是「公尺」,所以要先把:
162 cm
轉換成:
1.62 m
接著代入公式:
BMI = 50 ÷ (1.62 × 1.62)
計算後大約是:
19.05
所以今天要做的事情,其實可以拆成:
接收身高與體重
↓
把身高從 cm 轉成 m
↓
計算 BMI
↓
回傳結果
昨天已經使用過:
@RequestParam
所以今天可以直接利用它,同時接收兩個參數。
先建立:
@GetMapping("/bmi")
完整程式:
@GetMapping("/bmi")
public String calculateBMI(
@RequestParam double height,
@RequestParam double weight) {
return "Height: " + height + ", Weight: " + weight;
}
這次和昨天最大的不同,就是一次使用了兩個 @RequestParam:
@RequestParam double height
以及:
@RequestParam double weight
代表 Spring Boot 會分別接收:
height
和:
weight
兩個資料。
重新啟動 Spring Boot 後,在瀏覽器輸入:
http://localhost:8080/bmi?height=162&weight=50
這裡第一次出現了兩個參數。
可以拆成:
height=162
以及:
weight=50
兩個參數之間使用:
&
連接。
所以:
/bmi?height=162&weight=50
可以理解成:
height = 162
weight = 50
如果程式成功取得資料,就會回傳類似:
Height: 162.0, Weight: 50.0
這代表 Spring Boot 已經成功收到身高與體重!
資料成功傳進 Java 之後,下一步就是計算 BMI。
BMI 的公式是:
BMI = 體重(kg) ÷ 身高²(m²)
但是使用者輸入的身高是:
162 cm
所以第一步要先把公分轉成公尺:
double heightInMeters = height / 100;
例如:
162 ÷ 100 = 1.62
接著就可以計算 BMI:
double bmi = weight / (heightInMeters * heightInMeters);
完整的程式變成:
@GetMapping("/bmi")
public String calculateBMI(
@RequestParam double height,
@RequestParam double weight) {
double heightInMeters = height / 100;
double bmi = weight / (heightInMeters * heightInMeters);
return "Your BMI is: " + bmi;
}
重新執行後,再輸入:
http://localhost:8080/bmi?height=162&weight=50
這次 Spring Boot 就會進行真正的計算。
流程變成:
使用者輸入
height = 162
weight = 50
↓
@RequestParam
↓
Java 收到資料
↓
162 cm → 1.62 m
↓
50 ÷ (1.62 × 1.62)
↓
BMI ≈ 19.05
↓
回傳結果
但是實際執行的時候,可能會發現一個小問題。
Java 回傳的數字可能會變成:
19.05197378448407
這好像有點太長了 XD
所以接下來要把它整理得好看一點。
我們其實不需要顯示那麼多位小數。
所以可以使用:
String.format("%.2f", bmi)
其中:
%.2f
代表:
把浮點數顯示到小數點後兩位。
修改後:
@GetMapping("/bmi")
public String calculateBMI(
@RequestParam double height,
@RequestParam double weight) {
double heightInMeters = height / 100;
double bmi = weight / (heightInMeters * heightInMeters);
return "Your BMI is: " + String.format("%.2f", bmi);
}
現在重新輸入:
http://localhost:8080/bmi?height=162&weight=50
結果就會變成:
Your BMI is: 19.05
看起來舒服多了!
做到這裡,我又想到一個問題:
如果使用者輸入:
/bmi?height=0&weight=50
怎麼辦?
身高不可能是 0,而且如果直接拿 0 去計算,也沒有意義。
所以可以先加入一個簡單的判斷:
if (height <= 0 || weight <= 0) {
return "Height and weight must be greater than 0.";
}
完整程式:
@GetMapping("/bmi")
public String calculateBMI(
@RequestParam double height,
@RequestParam double weight) {
if (height <= 0 || weight <= 0) {
return "Height and weight must be greater than 0.";
}
double heightInMeters = height / 100;
double bmi = weight / (heightInMeters * heightInMeters);
return "Your BMI is: " + String.format("%.2f", bmi);
}
這樣如果使用者輸入不合理的數字,程式就不會直接進行計算。
雖然目前只是非常簡單的判斷,但也讓我開始發現:
寫程式不能只考慮「正確輸入」,也要思考使用者可能輸入什麼奇怪的東西。
現在我們的 BMI API 已經可以做到:
目前的網址:
http://localhost:8080/bmi?height=162&weight=50
整個流程就是:
使用者
↓
輸入 height、weight
↓
Spring Boot
↓
@RequestParam
↓
Java
↓
BMI 計算
↓
回傳結果
到這裡,我們終於完成了第一個真正具有「功能」的 API。
雖然已經可以算出:
Your BMI is: 19.05
但仔細想想,現在的程式其實只是:
BMI 計算機
跟「智慧健康助理」還有一段距離 XD
所以接下來可以思考:
如果系統除了告訴使用者:
BMI = 19.05
還能進一步整理資訊,使用起來應該會更完整。
不過這也讓我發現一件事情:
有固定公式的計算,其實根本不需要交給 AI。
例如 BMI:
輸入數值
↓
Java 計算
↓
得到確定的結果
這種事情直接讓 Java 做反而比較適合。
等之後遇到需要理解自然語言、整理文字資訊的功能,再交給 AI。
這也符合前幾天規劃的:
Java 負責資料與邏輯,AI 負責理解與產生文字。
昨天 Day 6 做到的是:
使用者輸入資料
↓
Java 收到資料
↓
把資料放進一句話
今天則進一步變成:
使用者輸入資料
↓
Java 收到資料
↓
進行計算
↓
判斷資料是否合理
↓
整理結果
↓
回傳給使用者
這也是第一次真正利用使用者輸入的資料完成一個功能。
今天終於完成智慧健康助理的第一個健康功能:
BMI 計算器!
也第一次同時使用兩個:
@RequestParam
接收:
height
weight
再利用 Java 進行計算。
今天也學到了一個很重要的觀念:
不是所有功能都需要 AI。
像 BMI 這種具有固定公式的功能,Java 就可以很準確地完成。
AI 應該留給更適合它的工作,例如理解文字、整理資訊與產生自然語言回覆。
現在我們的智慧健康助理,終於不只是會說 Hello 了!