Tạo App Dự Báo Thời Tiết Bằng Java, Bạn Đã Thử?
Nếu bạn đang tìm kiếm ý tưởng cho project của mình nhưng cảm thấy mông lung và lạc lối thì bây giờ tôi sẽ hướng dẫn anh em cách sử dụng các API có sẵn để tạo một App dự báo thời tiết với Java
API là viết tắt của chữ Application Programming Interface dịch nôm na ra tiếng Việt là giao diện lập trình ứng dụng (interface ở đây là giao diện). API là phương thức để kết nối, trao đổi dữ liệu những thư viện hay ứng dụng với nhau. API có thể được sử dụng cho hệ thống nhúng, phần cứng, phần mềm hay gần đây nhất là các hệ thống micro service với nhiều thành phần trong hệ thống được tách biệt riêng với nhau.
Cho anh em nào chưa biết về API, các bạn có thể đọc qua bài này để hiểu API là gì nhé Link
Các thư viện cần thiết
Để gọi một API, anh em cần sự hỗ trợ của những thư viện HTTP Client - thư viện giúp chương trình nhận và gửi kết quả từ các API, ở đây tôi sử dụng thư viện OkHttp.
Link dowload file jar-download.com .Nếu anh em sử dụng maven thì đây là dependency:
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
<version>2.7.5</version>
</dependency>
Nếu anh em chưa biết Maven là gì thì hãy tìm hiểu thêm tại đây: link
Kết quả từ API trả về sẽ là một chuỗi Json nên chúng ta cần chuyển đổi chuỗi Json đó thành các Object.
{
"cod": "200",
"message": 0,
"cnt": 10,
"list": [
{
"dt": 1595397600,
"main": {
"temp": 33.53,
"feels_like": 35.46,
"temp_min": 33.53,
"temp_max": 35.14,
"pressure": 1008,
"sea_level": 1006,
"grnd_level": 1005,
"humidity": 55,
"temp_kf": -1.61
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10d"
}
]
}
Để ví dụ cách chuyển Json thành Object, anh em cần dùng kĩ năng về String
của mình, lấy những cặp key-value từ String Json đó......
Thôi dẹp đi, lằng nhằng quá. Thay vì mất công xử lý chuỗi, chúng ta có thư viện Gson làm việc này.
Link dowload file .jar
http://www.java2s.com/Code/Jar/g/Downloadgson222jar.htm
Nếu bạn dùng Maven thì đây
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
Lấy API và phân tích
Trước hêt, anh em vào link này để lấy API : https://openweathermap.org/api
Nhớ đăng nhập nhé
Tiếp theo, kéo xuống và click vào cái này
Thực ra anh em lấy cái nào cũng được, nhưng mình sẽ lấy cái 16 ngày làm ví dụ.
Khi click vào, anh em sẽ được đọc một trang dài loằng ngoằng các cách sử dụng API nhưng đại loại là theo format này
api.openweathermap.org/data/2.5/forecast?q={city name},{state code}&cnt={cnt}&appid={your api key}
Để cho anh em nào không thể hoặc chưa biết cách truy cập API, anh em ấn vào API sau :
Trong đó:
q
là thành phố bạn muốn tìm dự báo thời tiếtAPIID
là Id của bạn khi đăng kíunits
là đơn vị đo nhiệt độmetric
là độ C.
Sau khi click vào, ta thấy như sau :
Oke rồi, bắt đầu phân tích nào.
Khoan, có gì đó sai sai thì phải, cả một đống hổ lốn thế kia thì phân tích làm sao? Oke, anh em làm theo tôi, Coppy toàn bộ nội dung trên.
Mở NeatBean -> Chuột phải vào Package -> new -> Other -> Other -> Json File.
Paste cái anh em coppy vào.
Tool -> Option -> Editor -> Formating -> Ở mục Category chọn Wraping. Oke
Và đây là thành quả
Thư viện Gson cho phép chúng ta lưu các giá trị ở những từ khóa vào những biến có tên tương tự trong một class java, dữ liệu một class sẽ được để trong dấu {}, dữ liệu của một mảng, một collection sẽ để trong []. Class nào nằm trong một class khác thì khai báo instance của class đó như một thuộc tính của class lớn.
Code nào!
Bước 1 : Tạo Project và Add thư viện .Jar
Chuột phải vào Libraries trong project chọn Add JAR/Folder... Add thư viện bạn vừa tải về (nhớ giải nén nhá).
Cấu trúc project sẽ như thế này :
Bước 2: dựa vào chuỗi Json để tạo các class trong Packge Data (Nhớ đặt tên property trong class đúng y hệt trong Json nhé, hoặc anh em có thể tham khảo project của mình).
Bước 3: Code class HandleApi
Thực ra class này chỉ có duy nhất 1 hàm đó là hàm gọi API, tham số truyền vào là tên thành phố
public class HandleAPI {
public static JsonResult getJsonData(String city) {
OkHttpClient client = new OkHttpClient();
Gson gson = new Gson();
JsonResult data = null;
// Tạo một request đến API
Request res = new Request.Builder().url("http://api.openweathermap.org/data/2.5/forecast?q="+city+"&APPID=bffca17bcb552b8c8e4f3b82f64cccd2&units=metric").build();
try {
// Gửi Request đến API và nhận về Response
Response response = client.newCall(res).execute();
//Một Response sẽ có Header và Body, ở đây mình chỉ lấy Body
ResponseBody body = response.body();
// Chuyển đổi Body - thực chất là chuỗi Json thành Object
data = gson.fromJson(body.string(), JsonResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
}
Bước 4: Tạo Gui
Anh em design theo gui này nhé, hoặc làm khác cũng được
Bước 5: Xử lý sự kiện
public class PrepareGui {
private WeatherApp weather;
private JsonResult result;
private ArrayList<Weather> listResult;
private int idx = 0;
public PrepareGui() {
weather = new WeatherApp();
prepare();
}
public WeatherApp getWeather() {
return weather;
}
private void prepare() {
weather.getBtn_find().setActionCommand("find");
weather.getBtn_find().addActionListener(new ButtonClick());
weather.getBtn_next().setActionCommand("next");
weather.getBtn_next().addActionListener(new ButtonClick());
weather.getBtn_pre().setActionCommand("pre");
weather.getBtn_pre().addActionListener(new ButtonClick());
}
private void show() {
String date = " Ngày: " + result.getList()[idx].getDt_txt();
String city = " Thành phố: " + result.getCity().getName();
String nation = " Quốc gia: " + result.getCity().getCountry();
String weath = " Thời tiết: " + result.getList()[idx].getWeather()[0].getDescription();
String nhietDo = " Nhiệt độ: " + result.getList()[idx].getMain().getTemp() + " độ C";
String apXuat = " Ap xuất: " + result.getList()[idx].getMain().getPresure();
String doAm = " Độ ẩm: " + result.getList()[idx].getMain().getHumidity();
String winSpeed = " Tốc độ gió: " + result.getList()[idx].getWind().getSpeed();
String clouds = " Mây: " + result.getList()[idx].getClouds().getAll() + "%";
weather.getLb_apXuat().setText(apXuat);
weather.getLb_city().setText(city);
weather.getLb_cloud().setText(clouds);
weather.getLb_date().setText(date);
weather.getLb_doAm().setText(doAm);
weather.getLb_nation().setText(nation);
weather.getLb_nhietDo().setText(nhietDo);
weather.getLb_weather().setText(weath);
weather.getLb_windSpeed().setText(winSpeed);
}
public class ButtonClick implements ActionListener {
@Override
public void actionPerformed(ActionEvent ae) {
String command = ae.getActionCommand();
if (command.equals("find")) {
find();
idx = 0;
} else if (command.equals("next")) {
idx = idx == 39 ? idx : idx + 1;
} else if (command.equals("pre")) {
idx = idx == 0 ? idx : idx - 1;
}
show();
}
private void find() {
result = HandleAPI.getJsonData((String) weather.getCb_city().getSelectedItem());
}
}
}
Bước 6: Viết Class Start và chạy
public class Start {
public static void main(String[] args) {
PrepareGui gui = new PrepareGui();
gui.getWeather().setVisible(true);
}
}
Anh em có thể tham khảo project hoàn chỉnh tại đây: https://github.com/VuaVoDanh729/Weather-App-Java
Kết quả khi chạy chương trình
Anh em chạy được thế này là oke nhé
Tạm kết
Như vậy sau bài viết này, tôi đã giúp anh em có thêm dự án để điền vào CV xin việc, để bắt đầu công cuộc thăm ngàn và kẹp ngần của mình. Mọi ý kiến thắc mắc, đóng góp hãy để lại ở comment phía dưới. Hẹn gặp anh em ở bài tiếp theo. <3