هيلو سڀ! ٽيليگرامس لاءِ بوٽس ٺاهڻ جو موضوع ڪجهه حد تائين ڇڪيل آهي، ۽ تمام گهڻيون هدايتون لکيون ويون آهن (مثال طور، هي هڪ ). تنهن ڪري، اسان بهتر طور تي ڪجهه ٽئين پارٽي API سان ڪم ڪرڻ تي هڪ ويجهي نظر رکون ٿا، ڇاڪاڻ ته هي ڪنهن به ويب ڊولپر لاء هڪ نازڪ مهارت آهي. مان فوري طور تي چوندس ته ايپليڪيشن سڀ کان وڌيڪ ڪارائتو ۽ ڪارائتو اڳڪٿي مهيا ڪرڻ لاءِ تيار نه ڪئي وئي آهي؛ موسم جي سائيٽن سان مقابلو ڪرڻ ۾ ڪو به مقصد ناهي؛ اهو سکڻ ضروري هو ته ريموٽ ڪنيڪشن سان ڪيئن ڪم ڪجي ۽ جاوا استعمال ڪندي ڊيٽا پارس ڪرڻ. سو، اچو ته معلوم ڪريون ته اسان کي پهرين ڪهڙي ضرورت آهي. اسان جي ايپليڪيشن بنيادي طور تي ٽن منطقي حصن تي مشتمل آهي:
- صارف کان پيغام قبول ڪريو
- پيغام کي پروسيس ڪريو، ۽، جيڪڏهن اهو صحيح حڪم آهي، جواب لاء ڊيٽا تيار ڪريو. اسان جي حالت ۾، موسم جي اڳڪٿي تيار ڪريو جيڪڏهن صارف صحيح شهر ۾ داخل ٿيو
- چيٽ ۾ استعمال ڪندڙ کي تيار معلومات موڪليو
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
توهان ڏسي سگهو ٿا ته اهڙي درخواست جو جواب ڪيئن نظر اچي ٿو برائوزر ۾. اسان اڳ ۾ ئي معلوم ڪيو آهي ته، حقيقت ۾، توهان کي صرف صحيح لنڪ جي پيروي ڪرڻ جي ضرورت آهي ۽ سرور ضروري ڊيٽا فراهم ڪندو. باقي اهو آهي ته اهو سکيو ته اهو ڪيئن ڪجي جاوا استعمال ڪندي. جاوا ۾ هڪ سادي GET درخواست هن طرح نظر اچي ٿي:
//создаём строку со ссылкой на нужную page,
//я тут её склеиваю из заранее определённых констант, меняя только сам город
String urlString = API_CALL_TEMPLATE + city + API_KEY_TEMPLATE;
//создаём an object который будет содержать ссылку
URL urlObject = new URL(urlString);
//создаём соединение, используя an object
HttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();
//выбираем тип requestа (GET)
connection.setRequestMethod("GET");
//тут мы указываем, данные о себе, что мы можем принять всё то,
//что примет и любой современный браузер
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
//В начало ответа server всегда вставляет число, по которому можно судить, прошло ли всё хорошо.
//200 - значит OK
int responseCode = connection.getResponseCode();
//на несуществующий город or город с опечаткой, server выдаст code ответа 404,
//бросаем на него исключение, чтобы обработать на уровне повыше и предложить
//пользователю ввести город заново
if (responseCode == 404) {
throw new IllegalArgumentException();
}
// создаём поток, вычитываем все строки, и склеиваем в одну большую строку,
//которую будем потом обрабатывать в других методах
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
جيڪڏهن درخواست صحيح هئي ۽ سرور موجود هو، اسان کي ڊيٽا جي هڪ شيٽ ملندي جنهن ۾ مفيد معلومات ان معلومات سان مليل آهي جيڪا هاڻي گهربل ناهي. JSON ۽ XML مان ضروري ڊيٽا آسانيءَ سان ڪڍڻ لاءِ، جاوا لاءِ لکين لئبرريون لکيون ويون آھن هر ذوق مطابق. جتان مون JSON کي ترجيح ڏني، مون ان کي پروسيس ڪرڻ لاءِ جڪسن نالي هڪ تمام مشهور لائبريري چونڊيو. رستي جي ذريعي، اهو ٿورو اڀياس ڪيو ويو آهي JavaRush ۾ ڪجهه اعلي سطح تي. JSON ڊيٽا جي وڏي مقدار کي پروسيس ڪرڻ لاء، اهو ضروري آهي ته دستاويز جي جوڙجڪ کي سمجهڻ. مددگار سائيٽون اهڙيون هڪ بچاء ۾ اچن ٿيون . کاٻي پاسي اسان وٽ اصل JSON آھي، ساڄي پاسي - ھڪڙي ترتيب ڏنل: اھو ڏسي سگھجي ٿو ته جواب 5 مٿين سطح جي JSON شين تي مشتمل آھي، جن مان 2 پيچيده آھن ۽ ھيٺين شاخن لاءِ نوڊس آھن. ڊيٽا جيڪا اسان ۾ دلچسپي رکي ٿي اها فهرست نوڊ ۾ محفوظ ڪئي وئي آهي . اندر جي فهرست 38 JSON لائينن جو هڪ صف آهي، هر هڪ مخصوص وقت تي موسم بيان ڪري ٿو. يعني اها هڪ قسم جي وڻ جهڙي اڏاوت آهي، جنهن ۾ جڙ، شاخون، ٽانڊا ۽ پٽاٽا به هوندا آهن :) ۽ ڪنڌن تي شاخون لڳنديون آهن. خوش قسمت، جڪسن ڪنهن به صحيح JSON کي وڻ جي نمائندگي ڪري سگهي ٿو. اهڙيء طرح، اسان جي ضرورت جي خاصيت جي نالي کي ڄاڻڻ (مثال طور، هوا جي گرمي)، ۽ اهو وڻ جي ڪهڙي سطح تي واقع آهي، ان کي حاصل ڪرڻ گهڻو مسئلو نه ٿيندو. پهرين، مون "فهرست" صف مان سڀئي لائينون ڪڍيون ۽ انهن کي الڳ فهرست ۾ شامل ڪيو. عام طور تي ڳالهائڻ، مون ڊيٽا سان شيٽ کي ٽڪر ۾ ڪٽيو، جن مان هر هڪ الڳ اڳڪٿي آهي. ننڍا حصا ذهن ۾ رکڻ ۽ هلائڻ لاء آسان آهن.
//JsonNode - это один из узлов в древовидной иерархии, от которого идут ветви
//получаем узел, который называется "list"
JsonNode arrNode = new ObjectMapper().readTree(data).get("list");
//если это действительно массив узлов
if (arrNode.isArray()) {
//выполняем для каждого узла, который содержится в массиве
for (final JsonNode objNode : arrNode) {
//в атрибуте "dt_txt" каждого маленького узла хранилось время прогноза, я отобрал данные за 9 утра и 6 вечера
String forecastTime = objNode.get("dt_txt").toString();
if (forecastTime.contains("09:00") || forecastTime.contains("18:00")) {
weatherList.add(objNode.toString());
}
}
}
تنهنڪري اسان کي تارن جي هڪ فهرست ملي ٿي، جنهن ۾ هر لڪير هڪ خاص وقت تي JSON موسم جي رپورٽ جي نمائندگي ڪري ٿي. باقي اهو آهي ته جيڪو توهان چاهيو ٿا اهو ڪڍيو ۽ ان کي فارميٽ ڪريو. جيڪڏهن اسان وٽ هن طرح هڪ لائن آهي:
"main":{"temp":261.45,"temp_min":259.086,"temp_max":261.45,"pressure":1023.48,"sea_level":1045.39,"grnd_level":1023.48,"humidity":79,"temp_kf":2.37}
پوء اهو هڪ نوڊ سڏيو ويندو آهي "مکيه". ان مان ڪا به ڊيٽا حاصل ڪرڻ لاءِ، مثال طور سمنڊ جي سطح، هيٺ ڏنل ڪوڊ ڪافي آهي:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
جڪسن توهان کي فوري طور تي عددي شڪل ۾ ڊيٽا جي نمائندگي ڪرڻ جي اجازت ڏئي ٿو:
double seaLevel = mainNode.get("sea_level").asDouble();
ھاڻي اسان اڳڪٿي مان ڪنھن به ڊيٽا کي ڪڍي سگھون ٿا، ۽ باقي رھيو آھي ان کي گڏ ڪرڻ لاءِ جيئن چاھيو ۽ ان کي ٽيليگرام ۾ صارف ڏانھن موڪليو. مڪمل سورس ڪوڊ منهنجي گٿب تي آهي ، پر توهان ڪوشش ڪري سگهو ٿا بوٽ کي عمل ۾ لنڪ استعمال ڪندي ، يا ڳولڻ سان @denifoBot ٽيليگرام ڳولا ۾. شهر جو نالو لازمي طور تي لاطيني ترجمي ۾ لکيو وڃي، مثال طور "ڪيو" يا "ماسڪو". توهان جي مهرباني، جيڪڏهن توهان ان کي آخر تائين پهچايو، مان معقول تنقيد کي قبول ڪريان ٿو، ڇو ته مان صرف GitHub تي سادي منصوبن کي سکي رهيو آهيان ۽ ترقي ڪري رهيو آهيان ته جيئن منهنجي شهر جي بکايل صلاحيتن سان مقابلو ڪرڻ لاءِ :) الوداع هر ڪنهن کي! پي ايس مان سمجهان ٿو ته هتي ٽائپس ٿي سگهي ٿي، تنهنڪري توهان هر شي کي ذاتي پيغام ۾، يا تبصري ۾ موڪلي سگهو ٿا جيڪڏهن توهان واقعي ناراض آهيو :)
GO TO FULL VERSION