دریافت وضعیت آب و هوا در کانستراکت
#1
Lightbulb 
به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
شاید براتون پیش اومده باشه که بخواین گزارش آب و هوا رو در کانستراکت دریافت کنین. برای اینکار به یک زبان سمت سرور و یک API آب و هوا نیاز دارین. توی این مطلب زبان سمت سرور ما PHP و API آب و هوا هم متعلق به پارسی جو هست که اطلاعات آب و هوا تا 6 روز آینده رو در اختیار ما قرار میده. منظور من از اطلاعات آب و هوایی برای هر روز توصیف نسبی آب و هوا (با کلماتی مثل نسیم، آرام یا ...)، بیشینه و کمینه دما و میانگین دماست. 
در ضمن این API رایگانه و نیازی به ریجستر کردن API Key با پرداخت یا بدون پرداخت هزینه وجود نداره و از همه مهم تر اینکه محدودیتی برای تعداد درخواست ها تعیین نشده. 
توضیحات کد PHP:
اتفاق چندان پیچیده ای در این کد نمیفته. میشه گفت تنها اتفاق شاید کمی پیچیده که بنده لحاظ کردم اینه که محتویات XML به آرایه انجمنی تبدیل میشن. در واقع API پارسی جو به صورت پیشفرض خروجی XML رو به ما تحویل میده که من در این کد به کمک یک تابع (فانکشن) این خروجی رو به آرایه انجمنی (دیکشنری) و بعد آرایه رو به جیسون تبدیل کردم تا استفاده از اطلاعات راحت تر باشه. 
برای استفاده از کد PHP هم کافیه شیء AJAX رو به پروژه اضافه کنین و کدهای PHP زیر رو در یک دایرکتوری مشخص از هاست یا سرورتون آپلود کنین. 
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
*/
    
// صدور مجوز AJAX و تنظیم صحیح کاراکترهای UTF-8
header('Access-Control-Allow-Origin: *');
header('content-type: text/plain; charset=utf-8');
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// تابع تبدیل XML به آرایه
function xmlToArray($xml$options = array()) {
    $defaults = array(
        'namespaceRecursive' => false,  
        
'removeNamespace' => false,     
        
'namespaceSeparator' => ':',    
        
'attributePrefix' => '@',       
        
'alwaysArray' => array(),       
        
'autoArray' => true,            
        
'textContent' => '$',           
        
'autoText' => true,            
        
'keySearch' => false,           
        
'keyReplace' => false         
    
);
    $options array_merge($defaults$options);
    $namespaces $xml->getDocNamespaces($options['namespaceRecursive']);
    $namespaces[''] = null;


    $attributesArray = array();
    foreach ($namespaces as $prefix => $namespace) {
        if ($options['removeNamespace']) {
            $prefix '';
        }
        foreach ($xml->attributes($namespace) as $attributeName => $attribute) {
          
            if 
($options['keySearch']) {
                $attributeName =
                    str_replace($options['keySearch'], $options['keyReplace'], $attributeName);
            }
            $attributeKey $options['attributePrefix']
                . ($prefix $prefix $options['namespaceSeparator'] : '')
                $attributeName;
            $attributesArray[$attributeKey] = (string)$attribute;
        }
    }


    $tagsArray = array();
    foreach ($namespaces as $prefix => $namespace) {
        if ($options['removeNamespace']) {
            $prefix '';
        }

        foreach ($xml->children($namespace) as $childXml) {
          
            $childArray 
xmlToArray($childXml$options);
            $childTagName key($childArray);
            $childProperties current($childArray);

          
            if 
($options['keySearch']) {
                $childTagName =
                    str_replace($options['keySearch'], $options['keyReplace'], $childTagName);
            }

            
            if 
($prefix) {
                $childTagName $prefix $options['namespaceSeparator'] . $childTagName;
            }

            if (!isset($tagsArray[$childTagName])) {
                
                $tagsArray
[$childTagName] =
                        in_array($childTagName$options['alwaysArray'], true) || !$options['autoArray']
                        ? array($childProperties) : $childProperties;
            } elseif (
                is_array($tagsArray[$childTagName]) && array_keys($tagsArray[$childTagName])
                === range(0count($tagsArray[$childTagName]) - 1)
            ) {
                
                $tagsArray
[$childTagName] = $childProperties;
            } else {
                
                $tagsArray
[$childTagName] = array($tagsArray[$childTagName], $childProperties);
            }
        }
    }

    $textContentArray = array();
    $plainText trim((string)$xml);
    if ($plainText !== '') {
        $textContentArray[$options['textContent']] = $plainText;
    }

    $propertiesArray = !$options['autoText'] || $attributesArray || $tagsArray || ($plainText === '')
        array_merge($attributesArray$tagsArray$textContentArray) : $plainText;


    return array(
        $xml->getName() => $propertiesArray
    
);
}
if (!empty(
$_GET['city'])){
// دریافت اطلاعات از وب سرویس پارسی جو
$data file_get_contents('http://parsijoo.ir/api?serviceType=weather-API&q=' $_GET['city']);
// بارگیری مقادیر XML
$xml=simplexml_load_string($data);
// تبدیل XML به آرایه
$d xmlToArray($xml);
// تبدیل آرایه به جیسون
$json json_encode($d,JSON_UNESCAPED_UNICODE);
// چاپ رشته جیسون خروجی
echo $json;
}elseif(empty(
$_GET['city'])){
    echo "You should enter the city.";
    
}
?>
 حالا اکشن Request URL شیء AJAX رو انتخاب کنین. برای آرگومان (ورودی) Tag یک مقدار دلخواه و یا هیچ مقداری لحاظ نکنین. آرگومان URL رو به شکل زیر وارد کنید:
کد:
"http://yourhost.com/file.php?city="&"x"
همونطور که مشخصه کد PHP ما تنها یک پارامتر می پذیره و اون پارامتر هم city نام داره. مقدار این پارامتر باید نام شهر موردنظر به انگلیسی باشه. در صورتی که مقداری برای این پارامتر لحاظ نشده باشه کد اجرا نمیشه و ارور زیر نمایش داده میشه:
کد:
You should enter the city.
مثال: فرض کنین من قصد دارم وضعیت آب و هوای شهر مشهد رو به دست بیارم. باید چنین ریکوئستی ارسال کنم:
کد:
"http://yourhost.com/file.php?city="&"mashhad"
خروجی که کد به من میده به این شکله:
کد:
{"main":{"sadana-services":{"weather-service":{"day":[{"day-name":"امروز","status":"آرام","symbol":"3","temp":"۱۸","city-name":"مشهد","max-temp":"۲۵","min-temp":"۱۴"},{"day-name":"فردا","max-temp":"۲۰","min-temp":"۱۳","symbol":"41"},{"day-name":"شنبه","max-temp":"۲۰","min-temp":"۹","symbol":"3"},{"day-name":"یک شنبه","max-temp":"۳۱","min-temp":"۱۴","symbol":"4"},{"day-name":"دوشنبه","max-temp":"۲۸","min-temp":"۱۲","symbol":"41"},{"day-name":"سه شنبه","max-temp":"۲۱","min-temp":"۱۱","symbol":"4"},{"day-name":"چهارشنبه","max-temp":"۲۰","min-temp":"۱۲","symbol":"41"}]}}}}
حالا میتونین  روی خروجی جیسون (در واقع AJAX.LASTDATA) با پلاگین جیسون (JSON) در کانستراکت پردازش لازم رو داشته باشین. 
توضیحات بیشتر راجع به خروجی جیسون:
کد:
max-temp --> بیشینه دما
min-temp --> کمینه دما
day-name --> نام روز
status --> توصیف آب و هوا به صورت نسبی و با کلماتی مانند نسیم، آرام یا ...
temp --> میانگین دما
city-name --> نام شهر
نکته: دقت کنین که اگر شهر وارد شده توسط وب سرویس (API) پارسی جو پشتیبانی نشه و داده ای براش ثبت نشده باشه خروجی جیسون به شکل زیر خواهد بود:
کد:
{"main":{"sadana-services":{"no_result":"true"}}}

نکته مهم برای بهینه سازی و کوتاه کردن کدها: 
کدهایی که بنده قرار دادم تقریباً طولانی هستند. برای اینکه کدها رو کوتاه تر کنیم میتونیم از تکنیک include یا require در زبان PHP استفاده کنیم. در واقع به نوعی ما فانکشن (تابع) تبدیل XML به آرایه انجمنی رو به تنهایی در یک فایل مجزا مثلاً با نام function.php قرار میدیم و بعد اون رو توی یک فایل دیگه فراخوانی میکنیم. دقت کنین که برای فراخوانی یک فایل PHP دیگه در فایل PHP دیگه راه های زیادی هست که بسته به شرایط به کار میاد. ولی به طورکلی همونطور که گفتم دو تابع require و include باید استفاده بشن. البته بماند که require_once و include_once رو هم داریم که یعنی یک بار فایل به روش require یا include فقط در همون قسمتی از برنامه که تعیین کردیم و نه کل برنامه مون فراخوانی بشه. اما تفاوت include با require در چی هست؟وقتی ما از include استفاده میکنیم اگر اون فایل PHP که مشخص می کنیم که فراخوانی بشه مشکلی داشته باشه ادامه برنامه ما اجرا میشه ولی اگر از require استفاده کنیم و مشکلی در فایل PHP فراخوانی شده باشه ادامه برنامه اجرا نمیشه و برنامه از قسمت فراخوانی فایل متوقف میشه و به پایان میرسه.با این توضیحات میفهمیم که در حالتی که الان باهاش مواجه هستیم باید فایل function.php رو از طریق تابع require فراخوانی کنیم. دستور فراخوانی با تابع require یا include در کد PHP ما به این شکل میشه:
کد:
include/require ('file.php');
اسم دیگه این تکنیک اصطلاحاً ساختن مستر پیج و صفحات فرعی هست. همونطور که گفته شد استفاده از این تکنیک میتونه کدهای شما رو کوتاه تر بکنه و البته اگر مشکلی هم پیش بیاد پیدا کردن مشکل و عیب یابی خیلی ساده تر خواهد بود.
امیدوارم از این مطلب لذت برده باشین. 
روشی که بیان شد ساده ترین روش ممکن برای دریافت وضعیت آب و هوای شهرهای ایران هست. 
خوشحال میشم نظراتتون رو بهم گوشزد کنین و اگر جایی اشتباهی دیدید حتماً در ادامه بیان کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: M.gh ، mhp ، mostafanastary ، amin hosseini
#2
ممنون
خیلی چیز جالبی بود.
مخصوصا اون اوقات شرعی

 
  پاسخ


 سپاس شده توسط: Master Badfar


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: